Kovarians och kontravarians (C#)

I C#aktiverar kovarians och kontravarians implicit referenskonvertering för matristyper, ombudstyper och allmänna typargument. Kovarians bevarar tilldelningskompatibiliteten och kontravariansen vänder 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 mindre härledd typ. Men den här åtgärden är inte typsäker, vilket visas i följande kodexempel.

object[] array = new String[10];  
// The following statement produces a run-time exception.  
// array[0] = 10;  

Med stöd för kovarians och kontravarians för metodgrupper kan du matcha metodsignaturer med ombudstyper. På så sätt kan du tilldela 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. Mer information finns i Varians i Ombud (C#) och Använda varians i ombud (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 allmänna gränssnitt och ombud och möjliggör implicit konvertering av generiska typparametrar. Mer information finns i Varians i Allmänna gränssnitt (C#) och Varians i Ombud (C#).

I följande kodexempel visas implicit referenskonvertering för allmänna gränssnitt.

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

Ett allmänt gränssnitt eller ombud kallas variant om dess generiska parametrar deklareras som varianta eller kontravarianta. Med C# kan du skapa egna variantgränssnitt och ombud. Mer information finns i Skapa generiska variantgränssnitt (C#) och varians i ombud (C#).

Rubrik Beskrivning
Varians i allmänna gränssnitt (C#) Diskuterar kovarians och kontravarians i allmänna 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 avvikelse i gränssnitt för allmänna samlingar (C#) Visar hur stöd för kovarians och kontravarians i gränssnitten IEnumerable<T> och IComparable<T> kan hjälpa dig att återanvända kod.
Varians i ombud (C#) Diskuterar kovarians och kontravarians i generiska och icke-generiska ombud och innehåller en lista över generiska variantdelegater i .NET.
Använda varians i ombud (C#) Visar hur du använder stöd för kovarians och kontravarians i icke-generiska ombud för att matcha metodsignaturer med ombudstyper.
Använda varians för Func- och Action Generic Delegates (C#) Visar hur stöd för kovarians och kontravarians i ombuden Func och Action kan hjälpa dig att återanvända kod.