2009-05-31 22 views

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 Tnelle posizioni di uscita e IComparable<T> ha Tsolo 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 
} 
+0

Grazie! Sembra che l'uso degli indicizzatori renda ogni classe non variante. Ma ICollection <> ha T solo nei parametri di input. – UserControl

+0

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. –

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.

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

Problemi correlati