2010-04-21 6 views
5

Ich verstehe nicht, warum 'x' unter konvertiert, aber 'y' und 'z' nicht.Unterstützt die Covarianz von C# 4 die Verschachtelung von Generika?

var list = new List<List<int>>(); 

IEnumerable<List<int>> x = list; 
List<IEnumerable<int>> y = list; 
IEnumerable<IEnumerable<int>> z = list; 

Hat die neue Kovarianz-Funktion funktioniert einfach nicht auf Generika von Generika oder bin ich etwas falsch? (Ich möchte die Verwendung von .Cast <> vermeiden, um y und z arbeiten zu lassen.)

Antwort

7

"z" ist in C# 4.0 in Ordnung, IEnumerable<T> ist kovariant. List<T> ist jedoch nicht, Sie können nicht "y" arbeiten.

Intuitiv, wenn es so wäre dies gültig:

List<IEnumerable<int>> y = list 
y.Add(new Stack<int>()); 

, die das Versprechen bricht, dass „Liste“ nur List<int> Elemente enthalten kann.

+0

Ok Teil des Problems war, dass 'z' für mich nicht funktionierte, weil ich immer noch 3.5 anvisierte. Hoppla. Danke für die Erklärung, dass 'y' nicht funktioniert, das macht Sinn. – scobi

1

Sie machen hier mehrere Fehler. Erstens, Kovarianz und Kontravarianz werden nicht für Werttypen unterstützt, also was auch immer Sie versuchen, mit "int" zu tun, würde nicht funktionieren.

Zweitens ist die gültige Beispiel für Varianz in verschachtelten generische Typen Überprüfung sieht mehr wie folgt aus:

var list = new List<List<String>>(); 
IEnumerable<IEnumerable<object>> z = list; 

I Liste der Liste der Strings IEnumerable von IEnumerables von Objekten zuweisen können, die Kovarianz ist. Weitere Informationen finden Sie unter Covariance and Contravariance FAQ.

Verwandte Themen