Out (generický modifikátor) (Visual Basic)
U parametrů obecného typu určuje klíčové slovo, Out
že typ je kovariantní.
Poznámky
Kovariance umožňuje použít odvozenější typ, než který určuje 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 Out
v obecných rozhraních a delegátech.
V obecném rozhraní lze parametr typu deklarovat kovariant, pokud splňuje následující podmínky:
Parametr typu se používá pouze jako návratový typ metod rozhraní a nepoužívá se jako typ argumentů metody.
Poznámka:
Toto pravidlo má jednu výjimku. Pokud v kovariantním rozhraní máte kontravariantní obecný delegát jako parametr metody, můžete použít kovariantní typ jako parametr obecného typu pro tohoto delegáta. Další informace o kovariantních a kontravariantních obecných delegátech naleznete v tématu Variance in Delegates and Using Variance for Func and Action Generic Delegates.
Parametr typu se nepoužívá jako obecné omezení pro metody rozhraní.
V obecném delegátu lze parametr typu deklarovat kovariant, pokud se používá pouze jako návratový typ metody a nepoužívá se pro argumenty metody.
Kovariance a kontravariance jsou podporovány pro odkazové typy, ale nejsou podporovány pro typy hodnot.
V jazyce Visual Basic nelze deklarovat události v kovariantských rozhraních bez zadání typu delegáta. Kovariantní 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 kovariantního typu umožňuje jeho metodám vracet více odvozených typů, než které specifikuje parametr typu. Například v rozhraní .NET Framework 4 IEnumerable<T>je typ T kovariantní, můžete přiřadit objekt IEnumerable(Of String)
typu k objektu IEnumerable(Of Object)
typu bez použití speciálních metod převodu.
Kovariantní delegát může být přiřazen jiný delegát stejného typu, ale s odvozenější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. Ukazuje také, jak můžete pro typy delegátů použít implicitní převod.
' 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