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.
V jazyce C# umožňují kovariance a kontravariance implicitní převod odkazů pro typy polí, typy delegátů a argumenty obecného 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 odvozeného typu na pole 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 porovnávání podpisů 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é vracejí 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 Rozptyl v delegátech (C#) a použití rozptylu v delegátech (C#).
Následující příklad kódu ukazuje podporu kovariance a kontravariance 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 rozhraní .NET Framework 4 a novějších verzích jazyk C# podporuje kovarianci a kontravariance v obecných rozhraních a delegátech a umožňuje implicitní převod parametrů obecného typu. Další informace najdete v tématu Varianta v obecných rozhraních (C#) a Varianta 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 je nazýváno variantní, pokud jsou jeho obecné parametry deklarovány jako 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í s variantami (C#) a Varianty v delegátech (C#).
Související témata
| Titulek | Popis |
|---|---|
| Rozptyl v obecných rozhraních (C#) | Popisuje kovarianci a kontravariance v obecných rozhraních a poskytuje seznam variant obecných rozhraní v .NET. |
| Vytváření variant obecných rozhraní (C#) | Ukazuje, jak vytvořit vlastní variantní rozhraní. |
| Použití rozptylu v rozhraních pro obecné kolekce (C#) | Ukazuje, jak podpora kovariance a kontravariance v rozhraních IEnumerable<T> a IComparable<T> může pomoct při opětovném použití kódu. |
| Rozptyl delegátů (C#) | Popisuje kovarianci a kontravarianci v generických a ne-generických delegátech a poskytuje seznam variant generických delegátů v .NET. |
| Použití variance v delegátech (C#) | Ukazuje, jak používat podporu kovariance a kontravariance v neobecných delegátech, aby se podpisy metod shodovaly s typy delegátů. |
| Použití variance u obecných delegátů Func a Action (C#) | Ukazuje, jak vám podpora kovariance a kontravariance v delegátech Func a Action může pomoci znovu použít kód. |