In (generický modifikátor) (Visual Basic)

U parametrů obecného typu určuje klíčové slovo, In že parametr typu je kontravariantní.

Poznámky

Kontravariance umožňuje použít méně odvozený typ, než který specifikuje obecný parametr. To umožňuje implicitní převod tříd, které implementují variantní rozhraní a implicitní převod typů delegátů.

Další informace naleznete v tématu Kovariance a Kontravariance.

Pravidla

Klíčové slovo můžete použít In v obecných rozhraních a delegátech.

Parametr typu lze deklarovat kontravariant v obecném rozhraní nebo delegát, pokud se používá pouze jako typ argumentů metody a nepoužívá se jako návratový typ metody. ByRef parametry nemohou být kovariantní nebo kontravariantní.

Kovariance a kontravariance jsou podporovány pro referenční typy a nejsou podporovány pro typy hodnot.

V jazyce Visual Basic nelze deklarovat události v kontravariantní rozhraní bez zadání typu delegáta. Kontravariantní rozhraní také nemohou mít vnořené třídy, výčty nebo struktury, ale mohou mít vnořené rozhraní.

Chování

Rozhraní s parametrem kontravariantního typu umožňuje jeho metodám přijímat argumenty nižších odvozených typů, než které určuje parametr typu rozhraní. Například v rozhraní .NET Framework 4 IComparer<T> , typ T je kontravariantní, můžete přiřadit objekt IComparer(Of Person) typu k objektu IComparer(Of Employee) typu typu bez použití speciálních metod převodu, pokud Employee dědí z Person.

Kontravariantní delegát může být přiřazen jiný delegát stejného typu, ale s méně odvozeným parametrem obecného typu.

Příklad – kontravariantní obecné rozhraní

Následující příklad ukazuje, jak deklarovat, rozšířit a implementovat kontravariantní obecné rozhraní. Také ukazuje, jak můžete použít implicitní převod pro třídy, které implementují toto rozhraní.

' 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

Příklad – kontravariantní obecný delegát

Následující příklad ukazuje, jak deklarovat, vytvořit instanci a vyvolat kontravariantní obecný delegát. Ukazuje také, jak můžete implicitně převést typ delegáta.

' 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

Viz také