Partager via


Covariance et contravariance (Visual Basic)

Dans Visual Basic, la covariance et la contravariance permettent la conversion de référence implicite pour les types de tableaux, les types délégués et les arguments de type générique. La covariance conserve la compatibilité des affectations et la contravariance l’inverse.

Le code suivant illustre la différence entre la compatibilité des affectations, la covariance et la contravariance.

' 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 covariance pour les tableaux permet la conversion implicite d’un tableau d’un type plus dérivé en tableau d’un type moins dérivé. Toutefois, cette opération n’est pas de type sécurisé, comme illustré dans l’exemple de code suivant.

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

La prise en charge de la covariance et de la contravariance pour les groupes de méthodes permet de faire correspondre les signatures de méthode avec les types délégués. Cette correspondance vous permet d’affecter à un délégué non seulement une méthode qui a une signature correspondante, mais également une méthode qui :

  • Retourne un type plus dérivé (covariance) que le type de retour spécifié par le type délégué.
  • Accepte les paramètres qui ont moins de types dérivés (contravariance) que ceux spécifiés par le type délégué.

Pour plus d’informations, consultez Variance dans les délégués (Visual Basic) et Utilisation de la variance dans les délégués (Visual Basic).

L’exemple de code suivant montre la prise en charge de la covariance et de la contravariance pour les groupes de méthodes.

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

Dans .NET Framework 4 ou version ultérieure, Visual Basic prend en charge la covariance et la contravariance dans les interfaces et délégués génériques et permet la conversion implicite de paramètres de type générique. Pour plus d’informations, consultez Variance dans les interfaces génériques (Visual Basic) et variance dans les délégués (Visual Basic).

L’exemple de code suivant montre la conversion de référence implicite pour les interfaces génériques.

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

Une interface ou un délégué générique est appelé variant si ses paramètres génériques sont déclarés covariants ou contravariants. Visual Basic vous permet de créer vos propres interfaces et délégués variants. Pour plus d’informations, consultez Création d’interfaces génériques de type variant (Visual Basic) et Variance dans les délégués (Visual Basic).

Titre Descriptif
Variance dans les interfaces génériques (Visual Basic) Décrit la covariance et la contravariance dans les interfaces génériques et fournit une liste d’interfaces génériques de variantes dans le .NET Framework.
Création d’interfaces génériques variant (Visual Basic) Montre comment créer des interfaces variant personnalisées.
Utilisation de variance dans les interfaces pour les collections génériques (Visual Basic) Montre comment la prise en charge de la covariance et de la contravariance dans les IEnumerable<T>IComparable<T> interfaces peut vous aider à réutiliser le code.
Variance dans les délégués (Visual Basic) Discute de la covariance et de la contravariance dans les délégués génériques et non génériques et fournit une liste de délégués génériques variant dans le .NET Framework.
Utilisation de la variance dans les délégués (Visual Basic) Montre comment utiliser la prise en charge de la covariance et de la contravariance dans les délégués non génériques pour faire correspondre des signatures de méthode avec des types délégués.
Utilisation de la variance pour les délégués génériques Func et Action (Visual Basic) Montre comment la prise en charge de la covariance et de la contravariance dans les délégués Func et Action peut vous aider à réutiliser du code.