Megosztás a következőn keresztül:


Kovariancia és contravariance (C#)

A C#-ban a kovariancia és a contravariance implicit referenciakonverziót biztosít a tömbtípusokhoz, delegálttípusokhoz és általános típusú argumentumokhoz. A kovariancia megőrzi a hozzárendelések kompatibilitását, és a contravariance megfordítja azt.

Az alábbi kód bemutatja a hozzárendelések 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ármaztatott 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 típus, ahogyan az az alábbi példakódban 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ódusaláírások delegált típusokkal való egyeztetését. Ez lehetővé teszi, hogy a meghatalmazottakhoz ne csak az egyező aláírással rendelkező metódusokat rendelje hozzá, 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ót a Meghatalmazottak varianciája (C#) és az Eltérés használata a meghatalmazottakban (C#) című témakörben talál.

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 az á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ó: Variance in Generic Interfaces (C#) and Variance in Delegates (C#).

Az alábbi példakód az általános felületek implicit referenciakonvertálását mutatja be.

IEnumerable<String> strings = new List<String>();  
IEnumerable<Object> objects = strings;  

Az általános illesztőt vagy delegáltat változónak nevezzük, ha az általános paraméterei kovariant vagy contravariant deklarálva vannak. A C# lehetővé teszi, hogy saját változatfelületeket és delegáltakat hozzon létre. További információ: Variant Generic Interfaces (C#) és Variance in Delegates (C#) (Variance in Delegates, C#) létrehozása.

Cím Leírás
Variancia az általános felületeken (C#) Ismerteti a kovarianciát és a contravariance-t az általános felületeken, és a .NET-ben elérhető általános változatfelületek listáját tartalmazza.
Általános Variant-felületek létrehozása (C#) Bemutatja, hogyan hozhat létre egyéni változatillesztőket.
Variancia használata általános gyűjteményekhez (C#) Bemutatja, hogyan segíthet a kovariancia és a contravariance támogatása a felületeken a IEnumerable<T>IComparable<T> kód újrafelhasználásában.
Variancia a meghatalmazottakban (C#) Általános és nem általános meghatalmazottak esetén a kovarianciát és a contravariance-t tárgyalja, és a .NET-ben megjeleníti az általános változatdelegáltak listáját.
Variancia használata a meghatalmazottakban (C#) Bemutatja, hogyan használható a kovariancia és a contravariance támogatás a nem általános meghatalmazottakban a metódusaláírások delegálttípusokkal való egyeztetéséhez.
Variancia használata func és action generic delegates (C#) esetén Bemutatja, hogyan segíthet a kovariancia és a contravariance támogatása a delegáltakban a FuncAction kód újrafelhasználásában.