Kovarianz und Kontravarianz (C#)Covariance and Contravariance (C#)

Kovarianz und Kontravarianz in C# ermöglichen die implizite Referenzkonvertierung für Arraytypen, Delegattypen und generische Typargumente.In C#, covariance and contravariance enable implicit reference conversion for array types, delegate types, and generic type arguments. Die Kovarianz behält die Zuweisungskompatibilität bei und die Kontravarianz kehrt sie um.Covariance preserves assignment compatibility and contravariance reverses it.

Der folgende Code veranschaulicht den Unterschied zwischen Zuweisungskompatibilität, Kovarianz und Kontravarianz.The following code demonstrates the difference between assignment compatibility, covariance, and contravariance.

// 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;  

Die Kovarianz für Arrays ermöglicht die implizite Konvertierung eines Arrays mit einem stärker abgeleiteten Typ zu einem Array mit einem schwächer abgeleiteten Typ.Covariance for arrays enables implicit conversion of an array of a more derived type to an array of a less derived type. Dieser Vorgang ist jedoch nicht typsicher, wie im folgenden Codebeispiel gezeigt wird.But this operation is not type safe, as shown in the following code example.

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

Die Unterstützung von Kovarianz und Kontravarianz für Methodengruppen ermöglicht es, Methodensignaturen mit Delegattypen abzugleichen.Covariance and contravariance support for method groups allows for matching method signatures with delegate types. Das bedeutet, dass Sie Delegaten nicht nur Methoden mit übereinstimmenden Signaturen zuweisen können, sondern auch Methoden, die mehrere abgeleitete Typen zurückgeben (Kovarianz) oder die Parameter akzeptieren, die über weniger abgeleitete Typen verfügen, als durch den Delegattyp angegeben wurde (Kontravarianz).This enables you to assign to delegates not only methods that have matching signatures, but also methods that return more derived types (covariance) or that accept parameters that have less derived types (contravariance) than that specified by the delegate type. Weitere Informationen finden Sie unter Variance in Delegates (C#) (Varianz in Delegaten (C#)) und Using Variance in Delegates (C#) (Verwenden von Varianz in Delegaten (C#)).For more information, see Variance in Delegates (C#) and Using Variance in Delegates (C#).

Im folgenden Codebeispiel wird die Unterstützung von Methodengruppen durch Kovarianz und Kontravarianz veranschaulicht.The following code example shows covariance and contravariance support for method groups.

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;  
}  

In .NET Framework 4 oder höher unterstützt C# die Kovarianz und Kontravarianz in generischen Schnittstellen und Delegaten und ermöglicht die implizite Konvertierung von generischen Typparametern.In .NET Framework 4 or newer C# supports covariance and contravariance in generic interfaces and delegates and allows for implicit conversion of generic type parameters. Weitere Informationen finden Sie unter Variance in Generic Interfaces (C#) (Varianz in generischen Schnittstellen (C#)) und Variance in Delegates (C#) (Varianz in Delegaten (C#)).For more information, see Variance in Generic Interfaces (C#) and Variance in Delegates (C#).

Das folgende Codebeispiel zeigt die implizite Verweiskonvertierung bei generischen Schnittstellen.The following code example shows implicit reference conversion for generic interfaces.

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

Generische Schnittstellen oder Delegate werden als variant bezeichnet, wenn deren generische Parameter als kovariant oder kontravariant deklariert sind.A generic interface or delegate is called variant if its generic parameters are declared covariant or contravariant. C# ermöglicht es Ihnen, eigene variante Schnittstellen oder Delegate zu erstellen.C# enables you to create your own variant interfaces and delegates. Weitere Informationen finden Sie unter Creating Variant Generic Interfaces (C#) (Erstellen von varianten generischen Schnittstellen (C#)) und Variance in Delegates (C#) (Varianz in Delegaten (C#)).For more information, see Creating Variant Generic Interfaces (C#) and Variance in Delegates (C#).

TitelTitle BeschreibungDescription
Varianz in generischen SchnittstellenVariance in Generic Interfaces (C#) Erläutert Ko- und Kontravarianz in generischen Schnittstellen und enthält eine Liste der Varianten generischen Schnittstellen in .NET Framework.Discusses covariance and contravariance in generic interfaces and provides a list of variant generic interfaces in the .NET Framework.
Creating Variant Generic Interfaces (C#) (Erstellen von varianten generischen Schnittstellen (C#))Creating Variant Generic Interfaces (C#) Zeigt, wie benutzerdefinierte variante Schnittstellen erstellt werden.Shows how to create custom variant interfaces.
Using Variance in Interfaces for Generic Collections (C#) (Verwenden von Varianz in Schnittstellen für generische Auflistungen (C#))Using Variance in Interfaces for Generic Collections (C#) Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz bei IEnumerable<T>- und IComparable<T>-Schnittstellen bei der Wiederverwendung Ihres Codes helfen kann.Shows how covariance and contravariance support in the IEnumerable<T> and IComparable<T> interfaces can help you reuse code.
Variance in Delegates (C#) (Varianz bei Delegaten (C#))Variance in Delegates (C#) Erläutert Ko- und Kontravarianz in generischen und nicht generischen Delegaten und stellt eine Liste von varianten generischen Delegaten im .NET Framework bereit.Discusses covariance and contravariance in generic and non-generic delegates and provides a list of variant generic delegates in the .NET Framework.
Using Variance in Delegates (C#) (Verwenden von Varianz in Delegaten (C#))Using Variance in Delegates (C#) Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz in nicht generischen Delegaten verwendet werden kann, um Methodensignaturen mit Delegattypen abzugleichen.Shows how to use covariance and contravariance support in non-generic delegates to match method signatures with delegate types.
Verwenden von Varianz für die generischen Delegaten Func und Action (C#)Using Variance for Func and Action Generic Delegates (C#) Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz bei Func- und Action-Delegaten bei der Wiederverwendung Ihres Codes helfen kann.Shows how covariance and contravariance support in the Func and Action delegates can help you reuse code.