Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V jazyce Visual Basic umožňují kovariance a kontravariance implicitní převod odkazů pro typy polí, typy delegátů a argumenty obecného 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 odvozeného typu na pole 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 porovnávání podpisů metod s typy delegátů. Tato shoda umožňuje přiřadit delegátu nejen metodu, která má odpovídající podpis, ale také metodu, která:
- Vrátí odvozenější typ (kovariance) než návratový typ určený typem delegáta.
- Přijímá parametry, které mají méně odvozených typů (kontravariance) než parametry určené typem delegáta.
Další informace naleznete v tématu Variance in Delegates (Visual Basic) a Using Variance in Delegates (Visual Basic).
Následující příklad kódu ukazuje podporu kovariance a kontravariance 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 rozhraní .NET Framework 4 nebo novější jazyk Visual Basic podporuje kovarianci a kontravarianci v obecných rozhraních a delegátech a umožňuje implicitní převod parametrů obecného typu. Další informace naleznete v tématu Variance in Generic Interfaces (Visual Basic) a Variance in Delegates (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 je nazýváno variantní, pokud jsou jeho obecné parametry deklarovány jako kovariantní nebo kontravariantní. Visual Basic umožňuje vytvářet vlastní variantní rozhraní a delegáty. Další informace naleznete v tématu Vytváření variant obecných rozhraní (Visual Basic) a Rozptyl v delegátech (Visual Basic).
Související články
| Titulek | Popis |
|---|---|
| Rozptyl v obecných rozhraních (Visual Basic) | Popisuje kovarianci a kontravariance v obecných rozhraních a poskytuje seznam variant obecných rozhraní v rozhraní .NET Framework. |
| Vytváření variant obecných rozhraní (Visual Basic) | Ukazuje, jak vytvořit vlastní variantní rozhraní. |
| Použití rozptylu v rozhraních pro obecné kolekce (Visual Basic) | Ukazuje, jak podpora kovariance a kontravariance v rozhraních IEnumerable<T> a IComparable<T> může pomoct při opětovném použití kódu. |
| Rozptyl delegátů (Visual Basic) | Popisuje kovarianci a kontravarianci v obecných a ne generických delegátech a poskytuje seznam variant obecných delegátů v rozhraní .NET Framework. |
| Využití variantnosti u delegátů (Visual Basic) | Ukazuje, jak používat podporu kovariance a kontravariance v neobecných delegátech, aby se podpisy metod shodovaly s typy delegátů. |
| Použití rozpětí pro generické delegáty typu Func a Action (Visual Basic) | Ukazuje, jak vám podpora kovariance a kontravariance v delegátech Func a Action může pomoci znovu použít kód. |