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

U parametrů obecného typu klíčové Out slovo určuje, že typ je kovariantní.

Poznámky

Kovariance umožňuje použít více odvozený typ, než je zadaný obecným parametrem. To umožňuje implicitní převod tříd, které implementují variantní rozhraní a implicitní převod typů delegátu.

Další informace najdete v tématu Kovariance a kontravariance.

Pravidla

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

V obecném rozhraní lze parametr typu deklarovat jako kovariantní, pokud splňuje následující podmínky:

  • Parametr typu se používá pouze jako návratový typ metod rozhraní a není použit jako typ argumentů metody.

    Poznámka

    Toto pravidlo má jednu výjimku. Pokud máte kovariantní rozhraní jako parametr metody kontravariantní obecný delegát, můžete pro tohoto delegáta použít kovariantní typ jako parametr obecného typu. Další informace o kovariantní a kontravariantní obecné delegáty najdete v tématu Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • Parametr typu se pro metody rozhraní používá jako obecné omezení.

V obecném delegátu lze parametr typu deklarovat jako kovariantní, pokud se používá pouze jako návratový typ metody a není použit pro argumenty metody.

Kovariance a kontravariance jsou podporovány pro odkazové typy, ale nejsou podporovány pro typy hodnot.

V Visual Basic nelze deklarovat události v kovariantní rozhraní bez určení typu delegátu. Kovariantní rozhraní také nemohou mít vnořené třídy, výčty ani struktury, ale mohou mít vnořená rozhraní.

Chování

Rozhraní, které má parametr kovariantní typu, umožňuje metodám vracet více odvozených typů než těch, které jsou určeny parametrem typu. Například vzhledem k tomu, že v .NET Framework 4 je typ T kovariantní, můžete objekt typu přiřadit k objektu typu bez použití speciálních metod IEnumerable<T> IEnumerable(Of String) IEnumerable(Of Object) převodu.

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

Příklad 1

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

' 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

Příklad 2

Následující příklad ukazuje, jak deklarovat, vytvořit instanci a vyvolat kovariantní obecný delegát. Také ukazuje, jak lze použít implicitní převod pro typy delegátů.

' 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

Viz také