¿Cuál es la razón real por esa limitación? ¿Es solo trabajo lo que debe hacerse? ¿Es conceptualmente difícil? ¿Es imposible?¿Por qué C# (4.0) no permite co y contravariancia en tipos de clases genéricas?
Seguro, no se podían usar los parámetros de tipo en los campos, porque son siempre de lectura-escritura. Pero esa no puede ser la respuesta, ¿verdad?
El motivo de esta pregunta es que estoy escribiendo un artículo sobre soporte de varianza en C# 4, y creo que debería explicar por qué está restringido a delegados e interfaces. Solo para invertir la carga de la prueba.
Actualización: Eric preguntó sobre un ejemplo.
¿Qué hay de esto (no sé si eso tiene sentido, sin embargo :-))
public class Lookup<out T> where T : Animal {
public T Find(string name) {
Animal a = _cache.FindAnimalByName(name);
return a as T;
}
}
var findReptiles = new Lookup<Reptile>();
Lookup<Animal> findAnimals = findReptiles;
La razón de tener que en una clase podría ser el caché que se llevó a cabo en la propia clase. ¡Y por favor no nombre a sus diferentes mascotas de la misma forma!
Por cierto, esto me lleva a optional type parameters in C# 5.0 :-)
Actualización 2: No estoy afirmando que el CLR y C# debería permitir esto. Solo estoy tratando de entender lo que me llevó a eso.
Claro, ese es un ejemplo razonable pero no ha mostrado nada que tampoco se pueda hacer con las interfaces. Simplemente haga la interfaz ILookup y haga que Lookup lo implemente. ¿Qué beneficio adicional convincente sobre la varianza de la interfaz agrega su escenario para la varianza de clase? –
Ninguno, en realidad. Además de eso, es menos código. Permítanme invertir la carga de la prueba. ¿Cómo podríamos explicar por qué no es compatible? No estoy pidiendo implementarlo, en realidad. "¡Siempre ha sido así" no cuenta! :-) –
No tenemos que proporcionar una justificación para * no * implementar una función. No implementar una característica es * gratis *. Por el contrario, tenemos que proporcionar una justificación para implementar una característica: las características pueden costar millones de dólares a Microsoft e imponer una carga aún mayor a nuestros clientes, que luego deben gastar tiempo y dinero aprendiendo sobre la función. –