Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In Visual Basic, la covarianza e la controvarianza consentono la conversione implicita dei riferimenti per tipi di matrice, tipi delegati e argomenti di tipo generico. La Covarianza mantiene la compatibilità delle assegnazioni e la controvarianza la inverte.
Il codice seguente illustra la differenza tra compatibilità delle assegnazioni, covarianza e controvarianza.
' 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
La Covarianza per le matrici consente la conversione implicita di una matrice di un tipo più derivato in una matrice di un tipo meno derivato. Tuttavia, questa operazione non è sicura per i tipi, come illustrato nell'esempio di codice seguente.
Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10
Il supporto di covarianza e controvarianza per i gruppi di metodi permette di abbinare le signature dei metodi con i tipi delegati. Questa corrispondenza consente di assegnare a un delegato non solo un metodo con una firma corrispondente, ma anche un metodo che:
- Restituisce un tipo più derivato (covarianza) rispetto al tipo restituito specificato dal tipo delegato.
- Accetta parametri con tipi meno derivati (controvarianza) rispetto a quelli specificati dal tipo delegato.
Per altre informazioni, vedere Varianza nei delegati (Visual Basic) e Uso della varianza nei delegati (Visual Basic).
L'esempio di codice seguente illustra il supporto della covarianza e della controvarianza per i gruppi di metodi.
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 o versioni successive Visual Basic supporta la covarianza e la controvarianza nelle interfacce e nei delegati generici e consente la conversione implicita di parametri di tipo generico. Per altre informazioni, vedere Varianza nelle interfacce generiche (Visual Basic) e Varianza nei delegati (Visual Basic).For more information, see Variance in Generic Interfaces (Visual Basic) and Variance in Delegates (Visual Basic).
Nell'esempio di codice seguente viene illustrata la conversione implicita dei riferimenti per le interfacce generiche.
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
Un'interfaccia o un delegato generico viene chiamato variant se i relativi parametri generici sono dichiarati covarianti o controvarianti. Visual Basic consente di creare interfacce e delegati varianti personalizzati. Per altre informazioni, vedere Creazione di interfacce generiche varianti (Visual Basic) e Varianza nei delegati (Visual Basic).
Articoli correlati
| Titolo | Descrizione |
|---|---|
| Varianza nelle interfacce generiche (Visual Basic) | Viene descritta la covarianza e la controvarianza nelle interfacce generiche e viene fornito un elenco di interfacce generiche varianti in .NET Framework. |
| Creazione di interfacce generiche varianti (Visual Basic) | Illustra come creare interfacce varianti personalizzate. |
| Uso della varianza nelle interfacce per le raccolte generiche (Visual Basic) | Illustra in che modo il supporto della covarianza e della controvarianza nelle interfacce IEnumerable<T> e IComparable<T> consente di riutilizzare il codice. |
| Variazione nei delegati (Visual Basic) | Illustra la covarianza e la controvarianza in delegati generici e non generici e fornisce un elenco di delegati generici varianti in .NET Framework. |
| Uso della varianza nei delegati (Visual Basic) | Illustra come usare il sostegno della covarianza e della controvarianza nei delegati non generici per far combaciare le firme dei metodi con i tipi di delegato. |
| Uso della varianza per i delegati generici Func e Action (Visual Basic) | Illustra in che modo il supporto della covarianza e della controvarianza nei Func e Action delegati può aiutarti a riutilizzare il codice. |