In (generischer Modifizierer) (Visual Basic)
Das Schlüsselwort In
gibt für generische Typparameter an, dass der Typparameter kontravariant ist.
Bemerkungen
Kontravarianz ermöglicht Ihnen die Verwendung eines weniger stark abgeleiteten Typs als der durch den generischen Parameter angegebene. Dadurch wird eine implizite Konvertierung von Klassen berücksichtigt, die variante Schnittstellen und Konvertierung von Delegattypen implementiert.
Weitere Informationen finden Sie unter Kovarianz und Kontravarianz.
Regeln
Sie können das In
-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.
Ein Typ-Parameter kann als kontravariant in einer generischen Schnittstelle oder einem generischen Delegaten deklariert werden, wenn er nur als Typ eines Methodenarguments und nicht als Methodenrückgabetyp verwendet wird. ByRef
-Parameter können nicht kovariant oder kontravariant sein.
Kovarianz und Kontravarianz werden für Verweistypen unterstützt, aber nicht für Werttypen.
In Visual Basic können Sie keine Ereignisse in contravarianten Schnittstellen deklarieren, ohne den Delegattyp anzugeben. Außerdem kann eine variante Schnittstelle keine geschachtelten Klassen, Enumerationen oder Strukturen enthalten, kann allerdings geschachtelte Schnittstellen aufweisen.
Verhalten
Mit einer Schnittstelle, die einen kontravarianten Typparameter hat, kann ihre Methode mehr abgeleitete Typen, als durch den Typparameter der Schnittstelle angegeben, akzeptieren. Da z.B. in .NET Framework 4 Typ T in der Schnittstelle IComparer<T> kontravariant ist, können Sie ein Objekt des IComparer(Of Person)
-Typs an ein Objekt des IComparer(Of Employee)
-Typs zuweisen, ohne besondere Konvertierungsmethoden zu verwenden, wenn Employee
von Person
erbt.
Ein kontravarianter Delegat kann einem anderen Delegaten desselben Typs zugewiesen werden, jedoch mit einem weniger stark abgeleiteten generischen Typparameter.
Beispiel - Kontravariante generische Schnittstelle
Im folgenden Beispiel wird gezeigt, wie Sie eine kontravariante generische Schnittstelle deklarieren, erweitern und implementieren können. Es wird auch gezeigt, wie Sie die implizite Konvertierung für Klassen verwenden können, die eine diese Schnittstelle implementieren können.
' 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 - Kontravarianter generischer Delegat
Das folgende Beispiel zeigt, wie Sie einen kontravarianten generischen Delegaten deklarieren, instanziieren und aufrufen. Es zeigt außerdem, 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