Partager via


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

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

Remarques

La covariance vous permet d’utiliser un type plus 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 Out mot clé dans les interfaces génériques et les délégués.

Dans une interface générique, un paramètre de type peut être déclaré covariant s’il satisfait aux conditions suivantes :

  • Le paramètre de type est utilisé uniquement comme type de retour de méthodes d’interface et n’est pas utilisé comme type d’arguments de méthode.

    Remarque

    Il existe une exception à cette règle. Si, dans une interface covariante, vous avez un délégué générique contravariant comme paramètre de méthode, vous pouvez utiliser le type covariant comme paramètre de type générique pour ce délégué. Pour plus d’informations sur les délégués génériques covariants et contravariants, consultez Variance dans les déléguéset utilisation de variance pour les délégués génériques func et action.

  • Le paramètre de type n’est pas utilisé comme contrainte générique pour les méthodes d’interface.

Dans un délégué générique, un paramètre de type peut être déclaré covariant s’il est utilisé uniquement comme type de retour de méthode et non utilisé pour les arguments de méthode.

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

Dans Visual Basic, vous ne pouvez pas déclarer d’événements dans des interfaces covariantes sans spécifier le type de délégué. En outre, les interfaces covariantes 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 covariant permet à ses méthodes de retourner plus de types dérivés que ceux spécifiés par le paramètre de type. Par exemple, étant donné que dans .NET Framework 4, dans IEnumerable<T>, le type T est covariant, vous pouvez affecter un objet du IEnumerable(Of String) type à un objet du IEnumerable(Of Object) type sans utiliser de méthodes de conversion spéciales.

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

Exemple 1

L’exemple suivant montre comment déclarer, étendre et implémenter une interface générique covariante. Il montre également comment utiliser la conversion implicite pour les classes qui implémentent une interface covariante.

' Covariant interface.
Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.
Interface IExtCovariant(Of Out R)
    Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.
Class Sample(Of R)
    Implements ICovariant(Of R)
End Class

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

    ' You can assign istr to iobj because
    ' the ICovariant interface is covariant.
    iobj = istr
End Sub

Exemple 2

L’exemple suivant montre comment déclarer, instancier et appeler un délégué générique covariant. Il montre également comment utiliser la conversion implicite pour les types délégués.

' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
    Return New Control()
End Function

Public Shared Function SampleButton() As Button
    Return New Button()
End Function

Private Sub Test()

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

    ' You can assign dButton to dControl
    ' because the DCovariant delegate is covariant.
    dControl = dButton

    ' Invoke the delegate.
    dControl()
End Sub

Voir aussi