Out (generischer Modifizierer) (Visual Basic)

Für generische Typparameter gibt das Out-Schlüsselwort an, dass der Typ kovariant ist.

Hinweise

Kovarianz ermöglicht es, einen stärker 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 Out-Schlüsselwort in generischen Schnittstellen und Delegaten verwenden.

In einer generischen Schnittstelle kann ein Typparameter kovariant deklariert werden, wenn er die folgenden Bedingungen erfüllt:

  • Der Typparameter wird nur als Rückgabetyp von Schnittstellenmethoden und nicht als Typ von Methodenargumenten verwendet.

    Tipp

    Es gibt allerdings eine Ausnahme zu dieser Regel. Wenn eine kovariante Schnittstelle einen kontravarianten generischen Delegaten als Methodenparameter enthält, können Sie den kovarianten Typ als generischen Typparameter für diesen Delegaten verwenden. Weitere Informationen über kovariante und kontravariante generische Delegaten finden Sie unter Varianz in Delegaten (C# und Visual Basic) und Verwenden von Varianz für die generischen Delegaten Func und Action (C# und Visual Basic).

  • Der Typparameter wird nicht als generische Einschränkung für die Schnittstellenmethoden verwendet.

In einem generischen Delegaten kann ein Typparameter kovariant deklariert werden, wenn er nur als Methodenrückgabetyp und nicht für Methodenargumente verwendet wird.

Kovarianz und Kontravarianz werden für Verweistypen, aber nicht für Werttypen unterstützt.

In Visual Basic können Sie keine Ereignisse in kovarianten Schnittstellen deklarieren, ohne den Delegattyp anzugeben. Kovariante Schnittstellen können außerdem zwar geschachtelte Schnittstellen, jedoch keine geschachtelten Klassen, Enumerationen oder Strukturen aufweisen.

Verhalten

Eine Schnittstelle, die über einen kovarianten Typparameter verfügt, ermöglicht es den zugehörigen Methoden, mehr abgeleitete Typen zurückzugeben als vom Typparameter angegeben. Da in .NET Framework 4 beispielsweise Typ T in IEnumerable<T> kovariant ist, können Sie einem Objekt des Typs IEnumerable(Of Object) ein Objekt des Typs IEnumerabe(Of String) zuweisen, ohne besondere Konvertierungsmethoden zu verwenden.

Einem kovarianten Delegaten kann ein anderer Delegat desselben Typs zugewiesen werden, allerdings mit einem stärker abgeleiteten generischen Typparameter.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie eine kovariante generische Schnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie die implizite Konvertierung für Klassen verwendet wird, die eine kovariante Schnittstelle implementieren.

' Covariant interface.
Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.
Interface IExtCovariant(Of Out R)
    Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.
Class Sample(Of R)
    Implements ICovariant(Of R)
End Class

Sub Main()
    Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
    Dim istr As ICovariant(Of String) = New Sample(Of String)()

    ' You can assign istr to iobj because
    ' the ICovariant interface is covariant.
    iobj = istr
End Sub

Im folgenden Beispiel wird veranschaulicht, wie ein kovarianter generischer Delegat deklariert, instanziiert und aufgerufen wird. Außerdem wird gezeigt, wie Sie die implizite Konvertierung für Delegattypen verwenden können.

' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
    Return New Control()
End Function

Public Shared Function SampleButton() As Button
    Return New Button()
End Function

Private Sub Test()

    ' Instantiating the delegates with the methods.
    Dim dControl As DCovariant(Of Control) =
        AddressOf SampleControl
    Dim dButton As DCovariant(Of Button) =
        AddressOf SampleButton

    ' You can assign dButton to dControl
    ' because the DCovariant delegate is covariant.
    dControl = dButton

    ' Invoke the delegate.
    dControl()
End Sub

Siehe auch

Referenz

In (generischer Modifizierer) (Visual Basic)

Konzepte

Varianz in generischen Schnittstellen (C# und Visual Basic)