In (generischer Modifizierer) (Visual Basic)
Für generische Typparameter gibt das In-Schlüsselwort an, dass der Typparameter kontravariant ist.
Hinweise
Kontravarianz ermöglicht es, einen weniger stark abgeleiteten Typ zu verwenden als durch den generischen Parameter angegeben. Dies ermöglicht die implizite Konvertierung von Klassen, die abweichende Schnittstellen implementieren, und die implizite Konvertierung von Delegattypen.
Weitere Informationen finden Sie unter Kovarianz und Kontravarianz (C# und Visual Basic).
Regeln
Sie können das In-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.
Ein Typparameter kann in einer generischen Schnittstelle oder einem Delegaten kontravariant deklariert werden, wenn er nur als Typ von Methodenargumenten und nicht als Methodenrückgabetyp verwendet wird. ByRef-Parameter können nicht kovariant oder kontravariant sein.
Kovarianz und Kontravarianz werden für Verweistypen, aber nicht für Werttypen unterstützt.
In Visual Basic können Sie keine Ereignisse in kontravarianten Schnittstellen deklarieren, ohne den Delegattyp anzugeben. Kontravariante Schnittstellen können außerdem zwar geschachtelte Schnittstellen, jedoch keine geschachtelten Klassen, Enumerationen oder Strukturen aufweisen.
Verhalten
Eine Schnittstelle mit einem kontravarianten Typparameter ermöglicht es, dass die zugehörigen Methoden Argumente von weniger stark abgeleiteten Typen akzeptieren können als die vom Schnittstellentypparameter angegebenen. Da in .NET Framework 4 Typ T in der IComparer<T>-Schnittstelle z. B. kontravariant ist, können Sie einem Objekt des IComparer(Of Employee)-Typs ein Objekt des IComparer(Of Person)-Typs zuweisen, ohne spezifische Konvertierungsmethoden zu verwenden, wenn Person Employee erbt.
Einem kontravarianten Delegaten kann ein anderer Delegat desselben Typs zugewiesen werden, allerdings mit einem weniger stark abgeleiteten generischen Typparameter.
Beispiel
Im folgenden Beispiel wird veranschaulicht, wie eine kontravariante generische Schnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie Sie die implizite Konvertierung für Klassen verwenden können, die diese Schnittstelle implementieren.
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface
' Extending contravariant interface.
Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface
' Implementing contravariant interface.
Class Sample(Of A)
Implements IContravariant(Of A)
End Class
Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()
' You can assign iobj to istr, because
' the IContravariant interface is contravariant.
istr = iobj
End Sub
Im folgenden Beispiel wird veranschaulicht, wie ein kontravarianter generischer Delegat deklariert, instanziiert und aufgerufen wird. Darüber hinaus wird gezeigt, wie Sie einen Delegattyp implizit konvertieren können.
' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)
' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub
Public Shared Sub SampleButton(ByVal control As Button)
End Sub
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton
' You can assign dControl to dButton
' because the DContravariant delegate is contravariant.
dButton = dControl
' Invoke the delegate.
dButton(New Button())
End Sub
Siehe auch
Referenz
Out (generischer Modifizierer) (Visual Basic)