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 Out Schlüsselwort an, dass der Typ kovariant ist.
Bemerkungen
Mit der Kovarianz können Sie einen abgeleiteten Typ als den vom generischen Parameter angegebenen Typ verwenden. 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 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 verwendet und nicht als Typ von Methodenargumenten verwendet.
Hinweis
Es gibt eine Ausnahme für diese Regel. Wenn Sie in einer kovarianten Schnittstelle über einen kontravarianten generischen Delegat als Methodenparameter verfügen, können Sie den kovarianten Typ als generischen Typparameter für diesen Delegaten verwenden. Weitere Informationen zu kovarianten und kontravarianten generischen Delegaten finden Sie unter Varianz in Delegaten und Using Variance for Func and Action Generic Delegates.
Der Typparameter wird nicht als generische Einschränkung für die Schnittstellenmethoden verwendet.
In einem generischen Delegat kann ein Typparameter kovariant deklariert werden, wenn er nur als Methodenrückgabetyp verwendet wird und nicht für Methodenargumente verwendet wird.
Kovarianz und Kontravarianz werden für Referenztypen unterstützt, werden jedoch für Werttypen nicht unterstützt.
In Visual Basic können Sie keine Ereignisse in kovarianten Schnittstellen deklarieren, ohne den Delegattyp anzugeben. Außerdem können kovariante Schnittstellen keine geschachtelten Klassen, Enumerationen oder Strukturen aufweisen, aber sie können geschachtelte Schnittstellen aufweisen.
Verhalten
Eine Schnittstelle mit einem kovarianten Typparameter ermöglicht es seinen Methoden, mehr abgeleitete Typen als vom Typparameter angegebene zurückzugeben. Da z. B. in .NET Framework 4 IEnumerable<T>typ T kovariant ist, können Sie einem Objekt des Typs ein IEnumerable(Of String) Objekt des IEnumerable(Of Object) Typs zuweisen, ohne spezielle Konvertierungsmethoden zu verwenden.
Einem kovarianten Delegaten kann ein anderer Delegat desselben Typs zugewiesen werden, jedoch mit einem abgeleiteten generischen Typparameter.
Beispiel 1
Das folgende Beispiel zeigt, wie eine kovariante generische Schnittstelle deklariert, erweitert und implementiert wird. Außerdem wird gezeigt, wie 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
Beispiel 2
Das folgende Beispiel zeigt, wie Sie einen generischen Kovariantendelegat deklarieren, instanziieren und aufrufen. Außerdem wird gezeigt, wie Sie die implizite Konvertierung für Stellvertretungstypen 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