Tipo di varianza .NET Framework 4.0
-
06-09-2019 - |
Domanda
IEnumerable<T>
, IComparable<T>
e pochi altri, sono ora di tipo variant. IList<T>
, ICollection<T>
e molti altri non lo sono.Perché?
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
Si veda anche: Cosa C # 4.0 covarianza non do
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.