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:
-
IEnumerable(T): T es covariante
-
IEnumerator(T): T es covariante
-
IQueryable(T): T es covariante
-
IGrouping(TKey, TElement): TKey y TElement son covariantes
-
IComparer(T): T es contravariante
-
IEqualityComparer(T): T es contravariante
-
IComparable(T): T es contravariante
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