IEnumerable<T>
, IComparable<T>
e alcuni altri sono ora di tipo variante. IList<T>
, ICollection<T>
e molti altri non lo sono. Perché?Tipo varianza in .NET Framework 4.0
6
A
risposta
11
.NET Framework 4.0 introduce sicuro co/contro-varianza. IList<T>
e ICollection<T>
avere T
sia in posizioni di ingresso e uscita mentre IEnumerable<T>
ha solo T
nelle posizioni di uscita e IComparable<T>
ha T
solo in ingresso le posizioni.
Si supponga IList<T>
supportato tipo varianza: "Il futuro di C#"
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
}
1
Anders Hejlseberg ha una breve, ma illuminante discussione che descrive co/controvarianza nel suo discorso, La sua discussione sulla covarianza e la contravarianza inizia a 50 minuti e 17 secondi nella presentazione.
2
Consulta anche: What C# 4.0 covariance doesn't do
Grazie! Sembra che l'uso degli indicizzatori renda ogni classe non variante. Ma ICollection <> ha T solo nei parametri di input. – UserControl
No, non è correlato agli indicizzatori in generale. Dipende dal parametro e dal tipo di ritorno degli indicizzatori (e dell'esistenza degli accessi get/set), proprio come qualsiasi altro metodo o proprietà. Potresti avere un indicizzatore come: T questo [int index] {get {return x [index]; }} e senza un set accessor, potrebbe essere una variante. –