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.
Pro parametry obecného typu použijte in klíčové slovo k povolení argumentů kontravariantního typu.
in Použijte klíčové slovo v obecných rozhraních a delegátech.
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#.
Kontravariance umožňuje použít méně odvozeného typu, než je typ určený obecným parametrem. Tato funkce umožňuje implicitní převod tříd, které implementují kontravariantní rozhraní a implicitní převod typů delegátů. Referenční typy podporují kovarianci a kontravariance v parametrech obecného typu, ale typy hodnot tyto funkce nepodporují.
Typ lze deklarovat jako kontravariant v obecném rozhraní nebo delegát pouze v případě, že definuje typ parametrů metody, a ne návratový typ metody.
In, refa out parametry musí být invariantní, což znamená, že nejsou kovariantní ani kontravariantní.
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 IComparer<T> rozhraní je typ T kontravariantní. Objekt IComparer<Person> typu lze přiřadit k objektu IComparer<Employee> typu bez použití speciálních metod převodu, pokud Employee dědí Person.
Kontravariantního delegáta můžete přiřadit jinému delegátovi stejného typu, ale s méně odvozeným parametrem obecného typu.
Další informace naleznete v tématu Kovariance a Kontravariance.
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<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
class Program
{
static void Test()
{
IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
}
}
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 void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }
public void Test()
{
// Instantiating the delegates with the methods.
DContravariant<Control> dControl = SampleControl;
DContravariant<Button> dButton = SampleButton;
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
// Invoke the delegate.
dButton(new Button());
}
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é
- ven
- Kovariance a kontravariance
- modifikátory