Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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