Pregunta

IEnumerable<T>, IComparable<T> y algunos más son ahora de tipo variable. IList<T>, ICollection<T> y muchos otros no lo son. ¿Por qué?

¿Fue útil?

Solución

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

Supongamos IList<T> apoyado varianza tipo:

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
}

Otros consejos

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top