Delen via


Covariantie en Contravariantie (Visual Basic)

In Visual Basic maken covariantie en contravariantie impliciete verwijzingsconversie mogelijk voor matrixtypen, gedelegeerdentypen en algemene typeargumenten. Covariantie behoudt de compatibiliteit van toewijzingen en contravariantie keert deze om.

De volgende code demonstreert het verschil tussen toewijzingscompatibiliteit, covariantie en contravariantie.

' 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

Covariantie voor matrices maakt impliciete conversie mogelijk van een matrix van een meer afgeleid type naar een matrix van een minder afgeleid type. Maar deze bewerking is niet veilig, zoals wordt weergegeven in het volgende codevoorbeeld.

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10

Covariantie- en contravariantieondersteuning voor methodegroepen maakt overeenkomende methodehandtekeningen met gedelegeerde typen mogelijk. Hiermee kunt u niet alleen methoden toewijzen aan gedelegeerden die overeenkomende handtekeningen hebben, maar ook methoden die meer afgeleide typen (covariantie) retourneren of parameters accepteren die minder afgeleide typen (contravariantie) hebben dan die zijn opgegeven door het gemachtigdetype. Zie Afwijking in gemachtigden (Visual Basic) en Variantie gebruiken in gemachtigden (Visual Basic) voor meer informatie.

In het volgende codevoorbeeld ziet u covariantie- en contravariantieondersteuning voor methodegroepen.

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 of hoger ondersteunt Visual Basic covariantie en contravariantie in algemene interfaces en gemachtigden en maakt impliciete conversie van algemene typeparameters mogelijk. Zie Variantie in algemene interfaces (Visual Basic) en variantie in gemachtigden (Visual Basic) voor meer informatie.

In het volgende codevoorbeeld ziet u impliciete verwijzingsconversie voor algemene interfaces.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

Een algemene interface of gemachtigde wordt een variant genoemd als de algemene parameters covariant of contravariant worden gedeclareerd. Visual Basic kunt u uw eigen variantinterfaces en gemachtigden maken. Zie Variant generic Interfaces (Visual Basic) en Variantie maken in gedelegeerden (Visual Basic) voor meer informatie.

Titel Beschrijving
Afwijking in algemene interfaces (Visual Basic) Beschrijft covariantie en contravariantie in algemene interfaces en biedt een lijst met variant-algemene interfaces in de .NET Framework.
Variant algemene interfaces maken (Visual Basic) Laat zien hoe u aangepaste variantinterfaces maakt.
Variantie gebruiken in interfaces voor algemene verzamelingen (Visual Basic) Laat zien hoe covariantie- en contravariantieondersteuning in de IEnumerable<T> en IComparable<T> interfaces u kunnen helpen code opnieuw te gebruiken.
Afwijking in gemachtigden (Visual Basic) Beschrijft covariantie en contravariantie in algemene en niet-generieke gemachtigden en biedt een lijst met variant-algemene gemachtigden in de .NET Framework.
Afwijking gebruiken in gemachtigden (Visual Basic) Laat zien hoe u covariantie- en contravariantieondersteuning gebruikt in niet-algemene gemachtigden om methodehandtekeningen te vinden met gedelegeerdentypen.
Variantie gebruiken voor algemene gedelegeerden voor func en actie (Visual Basic) Laat zien hoe covariantie- en contravariantieondersteuning in de Func en Action gedelegeerden u kunnen helpen code opnieuw te gebruiken.