Freigeben über


In (Generischer Modifizierer) (Visual Basic)

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

Siehe auch