La covarianza y la contradicción se trata de comprender el Is-a-Principle of inheritance.
En ambos, covarianza y contravarianza, s.th. se "transfiere", ya sea como valor de retorno o como argumento para el método delegado. Lo que se "traspasa" tiene que ser "atrapado" en un receptáculo. En C# - o la jerga de programación como tal - usamos el término cubo para lo que llamé receptáculo. A veces hay que recurrir a otras palabras para captar el significado de las palabras de jerga comúnmente utilizadas.
De todos modos, si usted entiende la herencia, que probablemente cualquier lector aquí, entonces, lo único a lo que prestarle atención es que el receptáculo, i. mi. el cubo utilizado para la captura debe ser del mismo tipo o de un tipo menos derivado que el que se está pasando; esto es cierto tanto para la covarianza como para la contravarianza.
La herencia dice que puedes atrapar un pájaro en un cubo de animal porque el pájaro es un animal. Entonces, si un parámetro de un método tiene que atrapar un pájaro, se puede atrapar en un cubo de animal (un parámetro de tipo animal), que entonces es una contravariancia. Y si su método, es decir, su delegado devuelve un pájaro, entonces el "cubo" también puede ser un tipo de ave o menos derivado (de un tipo principal) lo que significa que la variable donde captura el valor de retorno del método debe ser el mismo tipo o menos derivado que el valor de retorno.
Simplemente cambie su forma de pensar para discriminar entre lo que se está pasando y lo que atrapa, ya que entonces toda la complejidad sobre la covarianza y la contradicción se disuelve muy bien. Entonces te das cuenta de que el mismo principio está en el trabajo. Es solo que la herencia no puede ser violada, ya que fluye de una sola manera.
Y el compilador es tan inteligente que cuando lanza el depósito en el tipo más especializado (de nuevo, y según sea necesario) solo entonces obtiene todos los métodos especializados que se agregaron a la clase más derivada. Esa es la belleza de eso. Por lo tanto, es atrapar, lanzar y usar lo que tienes y tal vez necesites.
Amplia aliteración siempre divierte – Bob
Intenté responder a estas preguntas en una breve publicación de preguntas frecuentes: http://blogs.msdn.com/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx Todavía hay mucha confusión en torno a esta característica ... –