2009-05-31 13 views

Respuesta

11

.NET Framework 4.0 introduce caja fuerte co/contra-varianza. IList<T> y ICollection<T> tener T tanto en las posiciones de entrada y salida, mientras que IEnumerable<T> sólo tiene Ten posiciones de salida y IComparable<T> tiene Tsólo en las posiciones de entrada.

Asumir IList<T> tipo soportado varianza:

static void FailingMethod(IList<object> list) { 
    list[0] = 5; 
} 

static void Test() { 
    var a = new List<string>(); 
    a[0] = "hello"; 
    FailingMethod(a); // if it was variant, this method call would be unsafe 
} 
+0

Gracias! Parece que el uso de indexadores hace que cualquier clase no sea variante. Pero ICollection <> tiene T solo en los parámetros de entrada. – UserControl

+0

No, no está relacionado con indexadores en general. Depende del parámetro y el tipo de retorno de los indexadores (y la existencia de los descriptores de acceso get/set), al igual que cualquier otro método o propiedad. Es posible que tenga un indexador como: T este [int index] {get {return x [index]; }} y sin un acceso de conjunto, podría ser una variante. –

1

Anders Hejlseberg tiene una breve pero esclarecedora discusión que describe co/contravarianza en su charla, "El futuro de C#." Su discusión sobre covarianza y contravarianza comienza a los 50 minutos y 17 segundos de la presentación.

http://channel9.msdn.com/pdc2008/TL16/

Cuestiones relacionadas