En general, entiendo las interfaces, la herencia y el polimorfismo, pero una cosa me tiene desconcertado.IList <T> y List <T> Conversiones con interfaces
En este ejemplo, gato implementa IAnimal y por supuesto Lista implementa IList :
IList<IAnimal> cats = new List<Cat>();
pero genera un error de compilación (No se puede convertir implícitamente el tipo ...) . Tampoco funcionará si utilizo una superclase de asbtract [Animal] de la que Cat hereda. Sin embargo, si sustituyo IAnimal con gato:
IList<Cat> cats = new List<Cat>();
que compila bien.
En mi mente, porque gato implementa IAnimal, el primer ejemplo debería ser aceptable, lo que nos volvemos a una interfaz tanto para la lista y el tipo de contenido.
¿Alguien puede explicar por qué no es válido? Estoy seguro de que hay una explicación lógica.
+1: informativo y útil como de costumbre :) – Juliet
Gracias Eric. Definitivamente estaré leyendo tus artículos. También me disculpo por hacer una pregunta constantemente repetida también ... haré una mejor búsqueda la próxima vez. – Curtmantle
@Mark: De nada, y sin preocupaciones; el hecho de que esta pregunta se haga tanto es una de las cosas que motivó agregar la función a C# 4 en primer lugar. Claramente, las personas tienen la intuición de que la varianza genérica debe ser parte del sistema de tipos. Ahora solo se trata de educar a las personas sobre qué tipos de varianza son probablemente seguros. –