Kovariance a kontravariance (C#)
V jazyce C# umožňují kovariance a kontravariance implicitní převod odkazů pro typy polí, delegovat typy a obecné argumenty typu. Kovariance zachovává kompatibilitu přiřazení a kontravariance ji převrací.
Následující kód ukazuje rozdíl mezi kompatibilitou přiřazení, kovariancí a kontravariancem.
// 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;
Kovariance pro pole umožňuje implicitní převod pole více odvozeného typu na matici méně odvozeného typu. Tato operace ale není bezpečná, jak je znázorněno v následujícím příkladu kódu.
object[] array = new String[10];
// The following statement produces a run-time exception.
// array[0] = 10;
Podpora kovariance a kontravariance pro skupiny metod umožňuje odpovídající podpisy metod s typy delegátů. To umožňuje přiřadit delegátům nejen metody, které mají odpovídající podpisy, ale také metody, které vrací více odvozených typů (kovariance) nebo přijímají parametry, které mají méně odvozených typů (kontravariance), než které určuje typ delegáta. Další informace najdete v tématu Variance v delegátech (C#) a použití odchylky v delegátech (C#).
Následující příklad kódu ukazuje kovarianci a kontravariance podporu pro skupiny metod.
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;
}
V .NET Framework 4 a novějších verzích jazyk C# podporuje kovarianci a kontravarianci v obecných rozhraních a delegátech a umožňuje implicitní převod parametrů obecného typu. Další informace najdete v tématu Variance v obecných rozhraních (C#) a rozptylu v delegátech (C#).
Následující příklad kódu ukazuje implicitní převod odkazů pro obecná rozhraní.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Obecné rozhraní nebo delegát se nazývá varianta , pokud jsou její obecné parametry deklarovány kovariantní nebo kontravariantní. Jazyk C# umožňuje vytvářet vlastní variantní rozhraní a delegáty. Další informace najdete v tématu Vytváření obecných rozhraní variant (C#) a rozptylu v delegátech (C#).
Související témata
Nadpis | Popis |
---|---|
Odchylka v obecných rozhraních (C#) | Popisuje kovarianci a kontravarianci v obecných rozhraních a poskytuje seznam variant obecných rozhraní v .NET. |
Vytváření obecných rozhraní variant (C#) | Ukazuje, jak vytvořit vlastní variantní rozhraní. |
Použití rozptylu v rozhraních pro obecné kolekce (C#) | Ukazuje, jak vám kovariance a kontravariance v IEnumerable<T> rozhraních a IComparable<T> rozhraních můžou pomoct znovu použít kód. |
Odchylka v delegátech (C#) | Popisuje kovarianci a kontravarianci v obecných a ne generických delegátech a poskytuje seznam variant obecných delegátů v .NET. |
Použití odchylky v delegátech (C#) | Ukazuje, jak používat podporu kovariance a kontravariance v ne generických delegátech k porovnávání podpisů metod s typy delegátů. |
Použití odchylky pro obecné delegáty func a akce (C#) | Ukazuje, jak vám může pomoct znovu použít kód podpory kovariance a kontravariance v Func delegátech a Action delegátech. |