Domanda

IEnumerable<T>, IComparable<T> e pochi altri, sono ora di tipo variant. IList<T>, ICollection<T> e molti altri non lo sono.Perché?

È stato utile?

Soluzione

.NET Framework 4.0 introduce cassetta di sicurezza co/contra-varianza. IList<T> e ICollection<T> sono T sia in input e output posizioni, mentre IEnumerable<T> ha T solo in posizioni di uscita e IComparable<T> ha T solo nelle posizioni di input.

Assumere IList<T> tipo supportato 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
}

Altri suggerimenti

Anders Hejlseberg ha una breve, ma la discussione illuminante che descrive co / controvarianza nel suo discorso, "Il futuro della C #." La sua discussione su covarianza e controvarianza inizia a 50 minuti e 17 secondi dall'inizio della presentazione.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top