Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I C#aktiverar samvarians och kontravarians implicit referenskonvertering för matristyper, ombudstyper och allmänna typargument. Kovarians bevarar tilldelningskompatibiliteten och kontravariansen återställer den.
Följande kod visar skillnaden mellan tilldelningskompatibilitet, kovarians och kontravarians.
// 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;
Kovarians för matriser möjliggör implicit konvertering av en matris av en mer härledd typ till en matris av en mindre härledd typ. Men den här åtgärden är inte typsäker, som du ser i följande kodexempel.
object[] array = new String[10];
// The following statement produces a run-time exception.
// array[0] = 10;
Stöd för kovarians och kontravarians för metodgrupper möjliggör matchning av metodsignaturer med ombudstyper. På så sätt kan du tilldela till ombud inte bara metoder som har matchande signaturer, utan även metoder som returnerar fler härledda typer (kovarians) eller som accepterar parametrar som har mindre härledda typer (kontravarians) än de som anges av ombudstypen. För mer information, se Varians i delegater (C#) och Använda varians i delegater (C#).
I följande kodexempel visas stöd för kovarians och kontravarians för metodgrupper.
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;
}
I .NET Framework 4 och senare versioner stöder C# kovarians och kontravarians i generiska gränssnitt och delegater och möjliggör implicit konvertering av generiska typparametrar. Mer information finns i Varians i allmänna gränssnitt (C#) och varians i delegater (C#).
I följande kodexempel visas implicit referenskonvertering för generiska gränssnitt.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Ett generiskt gränssnitt eller ombud kallas variant om dess generiska parametrar deklareras som covarianta eller kontravarianta. Med C# kan du skapa egna variantgränssnitt och ombud. Mer information finns i Creating Variant Generic Interfaces (C#) and Variance in Delegates (C#).
Relaterade ämnen
Titel | Beskrivning |
---|---|
Varians i allmänna gränssnitt (C#) | Diskuterar kovarians och kontravarians i generiska gränssnitt och innehåller en lista över generiska variantgränssnitt i .NET. |
Skapa generiska variantgränssnitt (C#) | Visar hur du skapar anpassade variantgränssnitt. |
Använda varians i gränssnitt för generiska samlingar (C#) | Visar hur stöd för samvarians och kontravarians i gränssnitten IEnumerable<T> och IComparable<T> kan hjälpa dig att återanvända kod. |
Varians i delegater (C#) | Diskuterar kovarians och kontravarians i generiska och icke-generiska delegeringar och innehåller en lista över generiska variantdelegeringar i .NET. |
Genom att använda varians i delegater (C#) | Visar hur du använder samvarians- och kontravariansstöd i icke-generiska delegater för att matcha metodsignaturer med delegattyper. |
Använda varians för Func och Action generiska delegater (C#) | Visar hur kovarians och kontravarians i delegaterna Func och Action kan hjälpa dig att återanvända kod. |