Sdílet prostřednictvím


Kovariance a kontravariance (Visual Basic)

V Visual Basic umožňují kovariance a kontravariance implicitní převod odkazů pro typy polí, delegovat typy a obecné argumenty typu. Kovariance zachovává kompatibilitu přiřazení a kontravariance ji převrací.

Následující kód ukazuje rozdíl mezi kompatibilitou přiřazení, kovariancí a kontravariancem.

' 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

Kovariance pro pole umožňuje implicitní převod pole více odvozeného typu na matici méně odvozeného typu. Tato operace ale není bezpečná, jak je znázorněno v následujícím příkladu kódu.

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

Podpora kovariance a kontravariance pro skupiny metod umožňuje odpovídající podpisy metod s typy delegátů. To umožňuje přiřadit delegátům nejen metody, které mají odpovídající podpisy, ale také metody, které vrací více odvozených typů (kovariance) nebo přijímají parametry, které mají méně odvozených typů (kontravariance), než které určuje typ delegáta. Další informace najdete v tématu Variance v delegátech (Visual Basic) a použití odchylky v delegátech (Visual Basic).

Následující příklad kódu ukazuje kovarianci a kontravariance podporu pro skupiny metod.

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

V .NET Framework 4 nebo novějších Visual Basic podporuje kovarianci a kontravarianci v obecných rozhraních a delegátech a umožňuje implicitní převod obecných parametrů typu. Další informace najdete v tématu Variance v obecných rozhraních (Visual Basic) a rozptylu delegátů (Visual Basic).

Následující příklad kódu ukazuje implicitní převod odkazů pro obecná rozhraní.

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

Obecné rozhraní nebo delegát se nazývá varianta , pokud jsou její obecné parametry deklarovány kovariantní nebo kontravariantní. Visual Basic umožňuje vytvářet vlastní variantní rozhraní a delegáty. Další informace najdete v tématu Vytváření obecných rozhraní variant (Visual Basic) a odchylky v delegátech (Visual Basic).

Nadpis Popis
Odchylka v obecných rozhraních (Visual Basic) Popisuje kovarianci a kontravarianci v obecných rozhraních a poskytuje seznam variant obecných rozhraní v .NET Framework.
Vytváření obecných rozhraní variant (Visual Basic) Ukazuje, jak vytvořit vlastní variantní rozhraní.
Použití rozptylu v rozhraních pro obecné kolekce (Visual Basic) Ukazuje, jak vám kovariance a kontravariance v IEnumerable<T> rozhraních a IComparable<T> rozhraních můžou pomoct znovu použít kód.
Odchylka v delegátech (Visual Basic) Popisuje kovarianci a kontravarianci v obecných a ne generických delegátech a poskytuje seznam variant obecných delegátů v .NET Framework.
Použití odchylky v delegátech (Visual Basic) Ukazuje, jak používat podporu kovariance a kontravariance v ne generických delegátech k porovnávání podpisů metod s typy delegátů.
Použití odchylky pro obecné delegáty func a akce (Visual Basic) Ukazuje, jak vám může pomoct znovu použít kód podpory kovariance a kontravariance v Func delegátech a Action delegátech.