En las versiones anteriores de .NET, todas las interfaces genéricas eran invariantes, lo que significa que no se podia convertir parámetros de tipo en otros tipos en la jerarquía de herencia. Esto a cambiado en el .NET Framework 4, que ahora incluye compatibilidad con la varianza para varias interfaces genéricas ya existentes. La compatibilidad con la varianza habilita la conversión implícita de las clases que implementan estas interfaces. Las interfaces siguientes son ahora variantes:

  1. IEnumerable(T): T es covariante
  2. IEnumerator(T): T es covariante
  3. IQueryable(T): T es covariante
  4. IGrouping(TKey, TElement): TKey y TElement son covariantes
  5. IComparer(T): T es contravariante
  6. IEqualityComparer(T): T es contravariante
  7. IComparable(T): T es contravariante
Para un mayor detalle de covarianza y contravarianza, vea el artículo Covarianza y Contravarianza, en la Escuela del Programador.

La covarianza permite que un método, devuelva un tipo más derivado que el definido por el parámetro del tipo genérico de la interfaz. Para explicar la característica de covarianza, considere estas interfaces genéricas: IEnumerable<Object> e IEnumerable<String>. La interfaz IEnumerable<String> no hereda la interfaz IEnumerable<Object>. Sin embargo, el tipo String sí hereda el tipo Object y, en algunos casos, puede que desee asignar objetos de estas interfaces entre sí. Esto se muestra en el ejemplo de código siguiente. : C#:

 

IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;

VB:

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

En versiones anteriores de .NET Framework, este código produce un error de compilación en C# y en Visual Basic con Option Strict On. Ahora, sin embargo, puede usar objetos strings en lugar de objects, como se muestra en el ejemplo anterior, porque la interfaz IEnumerable(T) es covariante.
Continuará pronto...

respag
Panamá - © 2012
Haga su donación para colaborar con La Escuela del Programador

La Escuela del Programador es un sitio web sin anuncios, sin ánimo de lucro, no es un sitio web comercial. Es el sueño de compartir con todos, muchos años de una gran pasión. Si realmente encuentra este sitio útil y lo aprovecha, le pido su generosa y no importa cuán modesta colaboración, simplemente para afrontar los costos de mantener este sitio disponible en internet.
No deseo lucrar con este sitio, ya que lo hago desinteresadamente, sólo le pido que, si puede, aporte (desde un dólar hasta lo que crea que puede dar), para afrontar los costos de dominio y hosting. Muchísimas gracias y ojalá juntos podamos hacer un sitio que sea una buena fuente de aprendizaje de programacíon en español.

Si no se siente en condiciones de colaborar, igualmente será bienvenido al sitio, es libre para todos y será un placer que encuentre mis artículos provechosos, pero si realmente me ayuda con una donación minima, seguramente, colaborará para que La Escuela del Programador se mantenga en la Web y crezca, conviertiendo a este sitio hecho con mucha pasión, dedicación y esfuerzo, en una buena fuente de aprendizaje.

Mis saludos cordiales y gracias por interesarse en mi sitio.

Rubén E. Spagnuolo
respag
Panamá - © 2012