Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A C#-ban a kovariancia és a contravariance lehetővé teszi a tömbtípusok, delegálttípusok és általános típusargumentumok implicit referenciakonvertálását. A kovariancia megőrzi a hozzárendelés kompatibilitását, és a kontravariancia megfordítja azt.
Az alábbi kód bemutatja a hozzárendelés kompatibilitása, a kovariancia és a contravariance közötti különbséget.
// Assignment compatibility.
string str = "test";
// An object of a more derived type is assigned to an object of a less derived type.
object obj = str;
// Covariance.
IEnumerable<string> strings = new List<string>();
// An object that is instantiated with a more derived type argument
// is assigned to an object instantiated with a less derived type argument.
// Assignment compatibility is preserved.
IEnumerable<object> objects = strings;
// Contravariance.
// Assume that the following method is in the class:
static void SetObject(object o) { }
Action<object> actObject = SetObject;
// An object that is instantiated with a less derived type argument
// is assigned to an object instantiated with a more derived type argument.
// Assignment compatibility is reversed.
Action<string> actString = actObject;
A tömbök kovarianciája lehetővé teszi a származtatottabb típusú tömbök implicit átalakítását kevésbé származtatott típusú tömbökké. Ez a művelet azonban nem biztonságos, ahogy az alábbi kód példában is látható.
object[] array = new String[10];
// The following statement produces a run-time exception.
// array[0] = 10;
A metóduscsoportok kovariancia- és ellenvariancia-támogatása lehetővé teszi a metódusadák delegálási típusokkal való egyeztetését. Ez lehetővé teszi, hogy a meghatalmazottakhoz ne csak egyező aláírással rendelkező metódusokat rendeljen, hanem olyan metódusokat is, amelyek több származtatott típust (kovarianciát) adnak vissza, vagy olyan paramétereket fogadnak el, amelyek kevésbé származtatott típusok (contravariance) vannak, mint a delegált típus által megadottak. További információért lásd: Variance in Delegates (C#) és Using Variance in Delegates (C#).
Az alábbi példakód a metóduscsoportok kovariancia- és ellenvariancia-támogatását mutatja be.
static object GetObject() { return null; }
static void SetObject(object obj) { }
static string GetString() { return ""; }
static void SetString(string str) { }
static void Test()
{
// Covariance. A delegate specifies a return type as object,
// but you can assign a method that returns a string.
Func<object> del = GetString;
// Contravariance. A delegate specifies a parameter type as string,
// but you can assign a method that takes an object.
Action<string> del2 = SetObject;
}
A .NET-keretrendszer 4-es és újabb verzióiban a C# támogatja a kovarianciát és a contravariance-t általános felületeken és delegáltakban, és lehetővé teszi az általános típusú paraméterek implicit átalakítását. További információért: Variance in Generic Interfaces (C#) és Variance in Delegates (C#).
Az alábbi kódpéldában az általános felületek implicit referenciakonverziója látható.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Az általános interfészt vagy delegáltat variánsnak nevezzük, ha az általános paraméterei kovariantnak vagy contravariantnak vannak deklarálva. A C# lehetővé teszi saját variáns felületek és meghatalmazottak létrehozását. További információért lásd: Generikus interfészek varianciája (C#) és Delegáltak varianciája (C#).
Kapcsolódó témakörök
| Cím | Leírás |
|---|---|
| Variancia az általános felületeken (C#) | A kovariancia és az ellenvariancia általános felületeken való használatát ismerteti, és a .NET-ben megjeleníti a variáns általános interfészek listáját. |
| Variant Generic Interfaces (C#) létrehozása | Bemutatja, hogyan hozhat létre egyéni változati felületeket. |
| Variancia használata általános gyűjteményekhez készült interfészekben (C#) | Bemutatja, hogy a kovariancia és a kontravariancia támogatása a IEnumerable<T> és IComparable<T> felületeken hogyan segíthet a kód újrafelhasználásában. |
| Eltérés a meghatalmazottakban (C#) | Az általános és nem általános meghatalmazottak kovarianciáját és ellentravarianciáját tárgyalja, és a .NET-ben megjeleníti a variáns általános meghatalmazottak listáját. |
| Variancia használata a delegáltakban (C#) | Bemutatja, hogyan használható a kovariancia és kontravariancia a nem generikus delegáltakban a metódusaláírások és delegálttípusok egyeztetésére. |
| Variancia használata Func és Action generikus delegáltakhoz (C#) | Bemutatja, hogy a kovariancia és a kontravariancia támogatása a Func és Action delegáltaknál hogyan segíthet a kód újbóli felhasználásában. |