Gracias por todos los gritos, muchachos.
Las respuestas de Jon y Rasmus están bien, solo agregaría una nota técnica rápida.
Cuando se habla casualmente e informalmente, sí, las personas usan "covarianza" y "contravarianza" para referirse a un tipo específico de polimorfismo. Es decir, el tipo de polimorfismo en el que se trata una secuencia de arañas como si fuera una secuencia de animales.
Si tuviéramos que obtener todas las ciencias de la computación y tratar de hacer más definiciones técnicas, entonces probablemente no diría que la covarianza y la contravarianza son "una especie de polimorfismo". Me acercaría a una definición más técnica como esta:
Primero, señalaría que hay dos tipos posibles de polimorfismo en C# de los que podría estar hablando, y es importante no confundirlos.
El primer tipo se denomina tradicionalmente "polimorfismo ad hoc", y ese es el polimorfismo en el que tienes un método M (Animal x), y pasas arañas y jirafas y wallabies hacia él, y el método trata uniformemente su pasado. en argumentos de la misma manera mediante el uso de las similitudes garantizadas por la clase base Animal.
El segundo tipo se denomina tradicionalmente "polimorfismo paramétrico" o "polimorfismo genérico". Esa es la capacidad de hacer un método genérico M<T>(T t)
y luego tener un montón de código en el método que otra vez, trata el argumento de manera uniforme sobre la base de elementos comunes garantizados por las restricciones sobre T.
Creo que estás hablando de la primera clase de polimorfismo. Pero mi punto es que podemos definir el polimorfismo como la capacidad de un lenguaje de programación para tratar diferentes cosas de manera uniforme en función de una característica común conocida. (Por ejemplo, un conocido tipo de base, o interfaz implementada conocida.)
Covarianza y contravarianza es la capacidad de un lenguaje de programación para toma ventaja de puntos en común entre los tipos genéricos deducidas a partir de elementos comunes conocidas de sus argumentos de tipo.
Ah, sí de hecho estaba leyendo mensajes de Lippert, y los encontró q uite helpful –
Las publicaciones del blog fueron todas publicadas en octubre de 2007, creo, así que están disponibles en esta página: http://blogs.msdn.com/ericlippert/archive/2007/10.aspx –
No, había otra en la serie muy recientemente ("The void is invariant") –