Condividi tramite


In (modificatore generico) (Visual Basic)

Per i parametri di tipo generico, la In parola chiave specifica che il parametro di tipo è controvariante.

Osservazioni:

La controvarianza consente di usare un tipo meno derivato di quello specificato dal parametro generico. Ciò consente la conversione implicita di classi che implementano interfacce varianti e la conversione implicita dei tipi delegati.

Per altre informazioni, vedere Covarianza e Controvarianza.

Regole

È possibile usare la In parola chiave in interfacce e delegati generici.

Un parametro di tipo può essere dichiarato controvariante in un'interfaccia generica o delegato se viene usato solo come tipo di argomenti del metodo e non usato come tipo restituito del metodo. ByRef i parametri non possono essere covarianti o controvarianti.

La Covarianza e la controvarianza sono supportate per i tipi di riferimento e non sono supportate per i tipi valore.

In Visual Basic non è possibile dichiarare eventi nelle interfacce controvarianti senza specificare il tipo delegato. Inoltre, le interfacce controvarianti non possono avere classi annidate, enumerazioni o strutture, ma possono avere interfacce annidate.

Comportamento

Un'interfaccia con un parametro di tipo controvariante consente ai relativi metodi di accettare argomenti di tipi meno derivati rispetto a quelli specificati dal parametro del tipo di interfaccia. Ad esempio, poiché in .NET Framework 4, nell'interfaccia IComparer<T> il tipo T è controvariante, è possibile assegnare un oggetto del IComparer(Of Person) tipo a un oggetto del IComparer(Of Employee) tipo senza usare metodi di conversione speciali se Employee eredita da Person.

A un delegato controvariante può essere assegnato un altro delegato dello stesso tipo, ma con un parametro di tipo generico meno derivato.

Esempio : interfaccia generica controvariante

Nell'esempio seguente viene illustrato come dichiarare, estendere e implementare un'interfaccia generica controvariante. Illustra anche come usare la conversione implicita per le classi che implementano questa interfaccia.

' 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

Esempio : delegato generico controvariante

Nell'esempio seguente viene illustrato come dichiarare, creare un'istanza e richiamare un delegato generico controvariante. Viene inoltre illustrato come convertire in modo implicito un tipo delegato.

' 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

Vedere anche