Megosztás a következőn keresztül:


Kovariancia és contravariance (Visual Basic)

A Visual Basic a kovariancia és a contravariance lehetővé teszi a tömbtípusok, delegálttípusok és általános típusú argumentumok implicit referenciakonvertálását. A kovariancia megőrzi a hozzárendelések kompatibilitását, és a contravariance megfordítja azt.

Az alábbi kód bemutatja a hozzárendelések kompatibilitása, a kovariancia és a contravariance közötti különbséget.

' 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

A tömbök kovarianciája lehetővé teszi a származtatott típusú tömbök implicit átalakítását kevésbé származtatott típusú tömbökké. Ez a művelet azonban nem biztonságos típus, ahogyan az az alábbi példakódban látható.

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

A metóduscsoportok kovariancia- és ellenvariancia-támogatása lehetővé teszi a metódusaláírások delegált típusokkal való egyeztetését. Ez lehetővé teszi, hogy a meghatalmazottakhoz ne csak az egyező aláírással rendelkező metódusokat rendelje hozzá, hanem olyan metódusokat is, amelyek több származtatott típust (kovarianciát) adnak vissza, vagy olyan paramétereket fogadnak el, amelyek kevésbé származtatott típusok (contravariance) vannak, mint a delegált típus által megadottak. További információt a Meghatalmazottak (Visual Basic) és az Eltérés használata a meghatalmazottakban (Visual Basic) című témakörben talál.

Az alábbi példakód a metóduscsoportok kovariancia- és ellenvariancia-támogatását mutatja be.

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

A .NET-keretrendszer 4-es vagy újabb verzióiban a Visual Basic támogatja a kovarianciát és a contravariance-t az általános felületeken és delegáltakban, és lehetővé teszi az általános típusú paraméterek implicit átalakítását. További információ: Variancia az általános felületeken (Visual Basic) és variancia a meghatalmazottakban (Visual Basic).

Az alábbi példakód az általános felületek implicit referenciakonvertálását mutatja be.

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

Az általános illesztőt vagy delegáltat változónak nevezzük, ha az általános paraméterei kovariant vagy contravariant deklarálva vannak. Visual Basic lehetővé teszi saját változatfelületek és meghatalmazottak létrehozását. További információ: Általános Variant-felületek létrehozása (Visual Basic) és variancia a meghatalmazottakban (Visual Basic).

Cím Leírás
Variancia általános felületeken (Visual Basic) A kovarianciát és a contravariance-t tárgyalja az általános felületeken, és a .NET-keretrendszer tartalmazza a változat általános felületeinek listáját.
Általános Variant-felületek létrehozása (Visual Basic) Bemutatja, hogyan hozhat létre egyéni változatillesztőket.
Variancia használata általános gyűjteményekhez (Visual Basic) Bemutatja, hogyan segíthet a kovariancia és a contravariance támogatása a felületeken a IEnumerable<T>IComparable<T> kód újrafelhasználásában.
Meghatalmazottak eltérése (Visual Basic) Általános és nem általános meghatalmazottak kovarianciáját és ellenvarianciáját tárgyalja, és a .NET-keretrendszer tartalmazza a változat általános meghatalmazottainak listáját.
Variancia használata a meghatalmazottakban (Visual Basic) Bemutatja, hogyan használható a kovariancia és a contravariance támogatás a nem általános meghatalmazottakban a metódusaláírások delegálttípusokkal való egyeztetéséhez.
Variancia használata func és action általános meghatalmazottakhoz (Visual Basic) Bemutatja, hogyan segíthet a kovariancia és a contravariance támogatása a delegáltakban a FuncAction kód újrafelhasználásában.