Partager via


In (modificateur générique) (Visual Basic)

Pour les paramètres de type générique, le mot clé In spécifie que le paramètre de type est contravariant.

Notes

La contravariance vous permet d'utiliser un type moins dérivé que celui spécifié par le paramètre générique. Cela permet la conversion implicite des classes qui implémentent des interfaces variantes et la conversion implicite des types délégués.

Pour plus d'informations, consultez Covariance et contravariance (C# et Visual Basic).

Règles

Vous pouvez utiliser le mot clé In dans les interfaces et les délégués génériques.

Un paramètre de type peut être déclaré contravariant dans une interface ou un délégué générique s'il est utilisé uniquement comme type d'arguments de méthode et non utilisé comme type de retour de méthode. Les paramètres ByRef ne peuvent pas être covariants ou contravariants.

La covariance et la contravariance sont prises en charge pour les types référence mais pas pour les types valeur.

En Visual Basic, vous ne pouvez pas déclarer d'événements dans des interfaces contravariantes sans spécifier le type délégué. De même, les interfaces contravariantes ne peuvent pas avoir de classes, d'enums ou de structures imbriqués, mais elles peuvent inclure des interfaces imbriquées.

Comportement

Une interface ayant un paramètre de type contravariant autorise ses méthodes à accepter des arguments de types moins dérivés que ceux spécifiés par le paramètre de type d'interface. Par exemple, comme dans le .NET Framework 4, dans l'interface IComparer<T>, le type T est contravariant, vous pouvez assigner un objet de type IComparer(Of Person) à un objet de type IComparer(Of Employee) sans utiliser des méthodes de conversion spéciales si Person hérite de Employee.

Un autre délégué du même type peut être assigné à un délégué contravariant, mais avec un paramètre de type générique moins dérivé.

Exemple

L'exemple suivant indique comment déclarer, étendre et implémenter une interface générique contravariante. Il montre également comment vous pouvez utiliser la conversion implicite pour les classes qui implémentent cette interface.

' Contravariant interface.
Interface IContravariant(Of In A)
End Interface

' Extending contravariant interface.
Interface IExtContravariant(Of In A)
    Inherits IContravariant(Of A)
End Interface

' Implementing contravariant interface.
Class Sample(Of A)
    Implements IContravariant(Of A)
End Class

Sub Main()
    Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
    Dim istr As IContravariant(Of String) = New Sample(Of String)()

    ' You can assign iobj to istr, because
    ' the IContravariant interface is contravariant.
    istr = iobj
End Sub

L'exemple suivant indique comment déclarer, instancier et appeler un délégué générique contravariant. Il montre également comment vous pouvez convertir implicitement un type délégué.

' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)

' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub

Public Shared Sub SampleButton(ByVal control As Button)
End Sub

Private Sub Test()

    ' Instantiating the delegates with the methods.
    Dim dControl As DContravariant(Of Control) =
        AddressOf SampleControl
    Dim dButton As DContravariant(Of Button) =
        AddressOf SampleButton

    ' You can assign dControl to dButton
    ' because the DContravariant delegate is contravariant.
    dButton = dControl

    ' Invoke the delegate.
    dButton(New Button())
End Sub

Voir aussi

Référence

Out (modificateur générique) (Visual Basic)

Concepts

Variance dans les interfaces génériques (C# et Visual Basic)