Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Bei generischen Typparametern gibt das In Schlüsselwort an, dass der Typparameter kontravariant ist.
Bemerkungen
Contravariance ermöglicht ihnen die Verwendung eines weniger abgeleiteten Typs als der durch den generischen Parameter angegebene. Dies ermöglicht die implizite Konvertierung von Klassen, die Variantenschnittstellen und implizite Konvertierung von Delegatentypen implementieren.
Weitere Informationen finden Sie unter "Kovarianz" und "Contravariance".
Regeln
Sie können das In Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.
Ein Typparameter kann in einer generischen Schnittstelle oder einem Delegaten als Kontravariant deklariert werden, wenn er nur als Methodenargumenttyp verwendet und nicht als Methodenrückgabetyp verwendet wird.
ByRef Parameter können nicht kovariant oder kontravariant sein.
Kovarianz und Kontravarianz werden für Referenztypen unterstützt und für Werttypen nicht unterstützt.
In Visual Basic können Sie Keine Ereignisse in kontravarianten Schnittstellen deklarieren, ohne den Delegattyp anzugeben. Außerdem können kontravariante Schnittstellen keine geschachtelten Klassen, Enumerationen oder Strukturen aufweisen, aber sie können geschachtelte Schnittstellen aufweisen.
Verhalten
Eine Schnittstelle mit einem Kontravariantentypparameter ermöglicht es seinen Methoden, Argumente von weniger abgeleiteten Typen als vom Schnittstellentypparameter angegebenen zu akzeptieren. Da in .NET Framework 4 in der IComparer<T> Schnittstelle der Typ T kontravariant ist, können Sie einem Objekt des Typs ein Objekt IComparer(Of Person) des IComparer(Of Employee) Typs zuweisen, ohne spezielle Konvertierungsmethoden zu verwenden, wenn Employee sie von Person.
Einem Kontravariantendelegat kann ein anderer Delegat desselben Typs zugewiesen werden, jedoch mit einem weniger abgeleiteten generischen Typparameter.
Beispiel : contravariant generic interface
Im folgenden Beispiel wird gezeigt, wie eine generische Kontravarianzschnittstelle 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
Beispiel : contravariant generic delegate
Das folgende Beispiel zeigt, wie ein generischer Stellvertretung deklarieren, instanziieren und aufrufen. Außerdem 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