Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kovarianz und Kontravarianz in C# ermöglichen die implizite Referenzkonvertierung für Arraytypen, Delegattypen und generische Typargumente. Die Kovarianz behält die Zuordnungskompatibilität bei, und die Kontravarianz kehrt sie um.
Der folgende Code veranschaulicht den Unterschied zwischen Zuordnungskompatibilität, Kovarianz und Kontravarianz.
// 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 eines abgeleiteten Typs in ein Array eines weniger abgeleiteten Typs. Dieser Vorgang ist jedoch nicht typsicher, wie im folgenden Codebeispiel gezeigt.
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. 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). Weitere Informationen finden Sie unter Varianz in Stellvertretungen (C#) und Verwenden der Varianz in Stellvertretungen (C#).
Das folgende Codebeispiel zeigt die Kovarianz- und Kontravarianzunterstützung für Methodengruppen.
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 und höheren Versionen unterstützt C# Kovarianz und Kontravarianz in generischen Schnittstellen und Delegaten und ermöglicht die implizite Konvertierung generischer Typparameter. Weitere Informationen finden Sie unter Varianz in generischen Schnittstellen (C#) und Varianz in Delegaten (C#).For more information, see Variance in Generic Interfaces (C#) and Variance in Delegaten (C#).
Das folgende Codebeispiel zeigt die implizite Verweiskonvertierung für generische Schnittstellen.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Eine generische Schnittstelle oder Stellvertretung wird als Variante bezeichnet, wenn ihre generischen Parameter kovariant oder kontravariant deklariert werden. Mit C# können Sie eigene Variantenschnittstellen und Delegaten erstellen. 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#)).
Verwandte Themen
Titel | BESCHREIBUNG |
---|---|
Varianz in generischen Schnittstellen (C#) | Erläutert kovarianz und Kontravarianz in generischen Schnittstellen und stellt eine Liste der generischen Variantenschnittstellen in .NET bereit. |
Erstellen von generischen Variant-Schnittstellen (C#) | Zeigt, wie Benutzerdefinierte Variantenschnittstellen erstellt werden. |
Verwenden der Varianz in Schnittstellen für generische Auflistungen (C#) | Zeigt, wie die Kovarianz- und Kontravarianzunterstützung in den IEnumerable<T> und IComparable<T> Schnittstellen Ihnen helfen kann, Code wiederzuverwenden. |
Varianz bei Delegaten (C#) | Erläutert die Ko- und Kontravarianz in generischen und nicht generischen Delegaten und enthält eine Liste der unterschiedlichen generischen Delegate in .NET |
Verwenden von Varianz in Delegaten (C#) | Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz in nicht generischen Delegaten verwendet werden kann, um Methodensignaturen mit Delegattypen abzugleichen. |
Verwenden von Varianz für die generischen Delegaten Func und Action (C#) | Zeigt, wie die Unterstützung durch Kovarianz und Kontravarianz bei Func - und Action -Delegaten bei der Wiederverwendung Ihres Codes helfen kann. |