Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour les paramètres de type générique, le In
mot clé spécifie que le paramètre de type est contravariant.
Remarques
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 de classes qui implémentent des interfaces variant et la conversion implicite des types délégués.
Pour plus d’informations, consultez Covariance et Contravariance.
Règles
Vous pouvez utiliser le In
mot clé dans les interfaces génériques et les délégués.
Un paramètre de type peut être déclaré contravariant dans une interface générique ou un délégué s’il est utilisé uniquement comme type d’arguments de méthode et non utilisé comme type de retour de méthode.
ByRef
les paramètres ne peuvent pas être covariants ou contravariants.
La covariance et la contravariance sont prises en charge pour les types référence et non prises en charge pour les types valeur.
Dans Visual Basic, vous ne pouvez pas déclarer d’événements dans des interfaces contravariantes sans spécifier le type de délégué. En outre, les interfaces contravariantes ne peuvent pas avoir de classes imbriquées, d’énumérations ou de structures, mais elles peuvent avoir des interfaces imbriquées.
Comportement
Une interface qui a un paramètre de type contravariant permet à ses méthodes d’accepter des arguments de types moins dérivés que ceux spécifiés par le paramètre de type d’interface. Par exemple, étant donné que dans .NET Framework 4, dans l’interface IComparer<T> , le type T est contravariant, vous pouvez affecter un objet du IComparer(Of Person)
type à un objet du IComparer(Of Employee)
type sans utiliser de méthodes de conversion spéciales si Employee
hérite de Person
.
Un délégué contravariant peut être affecté à un autre délégué du même type, mais avec un paramètre de type générique moins dérivé.
Exemple : interface générique contravariante
L’exemple suivant montre comment déclarer, étendre et implémenter une interface générique contravariante. Il montre également comment 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
Exemple : délégué générique contravariant
L’exemple suivant montre comment déclarer, instancier et appeler un délégué générique contravariant. Il montre également comment convertir implicitement un type de 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