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.
Kovarianz und Kontravarianz in Visual Basic ermöglichen die implizite Referenzkonvertierung für Arraytypen, Delegattypen und generische Typargumente. Die Kovarianz behält die Zuordnungskompatibilität bei, und die Kontravarianz kehrt sie um.
Der folgende Code veranschaulicht den Unterschied zwischen Zuordnungskompatibilität, Kovarianz und Kontravarianz.
' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str
' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings
' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject
' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject
Die Kovarianz für Arrays ermöglicht die implizite Konvertierung eines Arrays eines abgeleiteten Typs in ein Array eines weniger abgeleiteten Typs. Dieser Vorgang ist jedoch nicht typsicher, wie im folgenden Codebeispiel gezeigt.
Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10
Die Unterstützung von Kovarianz und Kontravarianz für Methodengruppen ermöglicht es, Methodensignaturen mit Delegattypen abzugleichen. Mit diesem Abgleich können Sie einer Stellvertretung nicht nur eine Methode zuweisen, die über eine übereinstimmende Signatur verfügt, sondern auch eine Methode, die:
- Gibt einen abgeleiteten Typ (Kovarianz) zurück, der größer ist als der vom Delegattyp angegebene Rückgabetyp.
- Akzeptiert Parameter mit weniger abgeleiteten Typen (Kontravarianz) als diejenigen, die durch den Delegattyp festgelegt sind.
Weitere Informationen finden Sie unter Varianz in Stellvertretungen (Visual Basic) und Verwenden der Varianz in Stellvertretungen (Visual Basic).
Das folgende Codebeispiel zeigt die Kovarianz- und Kontravarianzunterstützung für Methodengruppen.
Shared Function GetObject() As Object
Return Nothing
End Function
Shared Sub SetObject(ByVal obj As Object)
End Sub
Shared Function GetString() As String
Return ""
End Function
Shared Sub SetString(ByVal str As String)
End Sub
Shared Sub Test()
' Covariance. A delegate specifies a return type as object,
' but you can assign a method that returns a string.
Dim del As Func(Of Object) = AddressOf GetString
' Contravariance. A delegate specifies a parameter type as string,
' but you can assign a method that takes an object.
Dim del2 As Action(Of String) = AddressOf SetObject
End Sub
In .NET Framework 4 oder höher unterstützt Visual Basic Kovarianz und Kontravarianz in generischen Schnittstellen und Delegaten und ermöglicht die implizite Konvertierung generischer Typparameter. Weitere Informationen finden Sie unter Varianz in generischen Schnittstellen (Visual Basic) und Varianz in Delegaten (Visual Basic).For more information, see Variance in Generic Interfaces (Visual Basic) and Variance in Delegaten (Visual Basic).
Das folgende Codebeispiel zeigt die implizite Verweiskonvertierung für generische Schnittstellen.
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
Eine generische Schnittstelle oder Stellvertretung wird als Variante bezeichnet, wenn ihre generischen Parameter kovariant oder kontravariant deklariert werden. Mit Visual Basic können Sie eigene Variantenschnittstellen und Delegaten erstellen. Weitere Informationen finden Sie unter Creating Variant Generic Interfaces (Visual Basic) (Erstellen von varianten generischen Schnittstellen (Visual Basic)) und Variance in Delegates (Visual Basic) (Varianz in Delegaten (Visual Basic)).
Verwandte Artikel
Titel | BESCHREIBUNG |
---|---|
Varianz in generischen Schnittstellen (Visual Basic) | Erläutert Kovarianz und Kontravarianz in generischen Schnittstellen und stellt eine Liste der generischen Variantenschnittstellen in .NET Framework bereit. |
Erstellen von generischen Variant-Schnittstellen (Visual Basic) | Zeigt, wie Benutzerdefinierte Variantenschnittstellen erstellt werden. |
Verwenden der Varianz in Schnittstellen für generische Auflistungen (Visual Basic) | Zeigt, wie die Kovarianz- und Kontravarianzunterstützung in den IEnumerable<T> und IComparable<T> Schnittstellen Ihnen helfen kann, Code wiederzuverwenden. |
Variance in Delegates (Visual Basic) (Varianz in Delegaten (Visual Basic)) | Erläutert Ko- und Kontravarianz in generischen und nicht generischen Delegaten und stellt eine Liste von varianten generischen Delegaten im .NET Framework bereit. |
Using Variance in Delegates (Visual Basic) (Verwenden von Varianz in Delegaten (Visual Basic)) | Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz in nicht generischen Delegaten verwendet werden kann, um Methodensignaturen mit Delegattypen abzugleichen. |
Using Variance for Func and Action Generic Delegates (Visual Basic) (Verwenden von Varianz für die generischen Delegaten Func und Action (Visual Basic)) | Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz bei Func - und Action -Delegaten bei der Wiederverwendung Ihres Codes helfen kann. |