Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
U parametrů obecného typu určuje klíčové slovo, out že parametr typu je kovariantní.
out Použijte klíčové slovo v obecných rozhraních a delegátech.
Kovariance umožňuje použít odvozenější typ, než určuje obecný parametr. Tato funkce umožňuje implicitní převod tříd, které implementují kovariantní rozhraní a implicitní převod typů delegátů. Kovariance a kontravariance podporují odkazové typy, ale nepodporují typy hodnot.
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 .NET, in IEnumerable<T>, typ T je kovariantní, můžete přiřadit objekt IEnumerable<string> typu k objektu IEnumerable<object> typu bez použití speciálních metod převodu.
Kovariantní delegáta můžete přiřadit jinému delegátovi stejného typu, ale s odvozenějším parametrem obecného typu.
Další informace naleznete v tématu Kovariance a Kontravariance.
Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.
Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.
Návod
Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.
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<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
V obecném rozhraní deklarujte kovariantní parametr typu, pokud splňuje následující podmínky:
Parametr typu použijete pouze jako návratový typ metod rozhraní a nepoužíváte ho jako typ argumentů metody.
Poznámka:
Toto pravidlo má jednu výjimku. Pokud kovariantní rozhraní má 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 nepoužíváte jako obecné omezení pro metody rozhraní.
Následující příklad ukazuje, jak deklarovat, vytvořit instanci a vyvolat kovariantní obecný delegát. Ukazuje také, jak implicitně převést typy delegátů.
// Covariant delegate.
public delegate R DCovariant<out R>();
// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }
public static Button SampleButton()
{ return new Button(); }
public void Test()
{
// Instantiate the delegates with the methods.
DCovariant<Control> dControl = SampleControl;
DCovariant<Button> dButton = SampleButton;
// You can assign dButton to dControl
// because the DCovariant delegate is covariant.
dControl = dButton;
// Invoke the delegate.
dControl();
}
V obecném delegátu deklarujte kovariantní typ, pokud jej použijete pouze jako návratový typ metody, a ne pro argumenty metody.
Specifikace jazyka C#
Další informace najdete ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.
Viz také
- Rozptyl v obecných rozhraních
- v lokalitě
- modifikátory