2010-04-21 20 views
5

No entiendo por qué 'x' a continuación se convierte, pero 'y' y 'z' no.¿La covarianza de C# 4 respalda la anidación de genéricos?

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

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

¿La función de nueva covarianza simplemente no funciona en genéricos de genéricos o estoy haciendo algo mal? (Me gustaría evitar usar .Cast <> para hacer que yyz funcionen.)

Respuesta

7

"z" está bien en C# 4.0, IEnumerable<T> es covariante. List<T> sin embargo, no, no puede hacer que "y" funcione.

Intuitivamente, si fuera entonces esto sería válida:

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

que rompe la promesa de que "la lista" sólo puede contener elementos List<int>.

+0

Bueno, parte del problema era que 'z' no funcionaba para mí porque todavía tenía como objetivo 3.5. Oops. Gracias por la explicación de que 'y' no funciona, tiene sentido. – scobi

1

Usted está cometiendo varios errores aquí. Primero, la covarianza y la contravarianza no son compatibles con los tipos de valores, por lo que lo que intente hacer con "int" no funcionaría.

En segundo lugar, el ejemplo válida la comprobación de variación en los tipos genéricos anidados se parece más a esto:

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

puedo asignar Lista de Lista de cadenas para IEnumerable de IEnumerables de objetos, que es la covarianza. Para obtener más información, consulte Covariance and Contravariance FAQ.

Cuestiones relacionadas