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 PersonEmployee 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)

Konzepte

Varianz in generischen Schnittstellen (C# und Visual Basic)