Condividi tramite


In (modificatore generico) (Visual Basic)

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

Note

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

Per ulteriori informazioni, vedere Covarianza e controvarianza (C# e Visual Basic).

Regole

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

Un parametro di tipo può essere dichiarato controvariante in un'interfaccia o delegato generico se è utilizzato solo come tipo di argomenti di metodo e non come tipo restituito dal metodo. I parametri ByRef non possono essere covarianti o controvarianti.

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

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

Comportamento

Un'interfaccia che dispone di un parametro di tipo controvariante consente ai metodi di accettare argomenti di tipi meno derivati di quelli specificati dal parametro di tipo di interfaccia. Poiché, ad esempio, in .NET Framework 4, nell'interfaccia IComparer<T>, il tipo T è controvariante, è possibile assegnare un oggetto del tipo IComparer(Of Person) a un oggetto del tipo IComparer(Of Employee) senza utilizzare alcun metodo di conversione speciale se Person eredita Employee.

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

Esempio

Nell'esempio seguente viene illustrato come dichiarare, estendere e implementare un'interfaccia generica controvariante. Viene inoltre illustrato come sia possibile utilizzare 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

Nell'esempio seguente viene illustrato come dichiarare, creare un'istanza e richiamare un delegato generico controvariante. Viene inoltre illustrato come sia possibile 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

Riferimenti

Out (modificatore generico) (Visual Basic)

Concetti

Varianza nelle interfacce generiche (C# e Visual Basic)