2009-05-31 17 views

Odpowiedz

11

.NET Framework 4.0 wprowadza bezpieczne co/contra-variance. IList<T> i ICollection<T> mieć T zarówno na stanowiskach wejściowych i wyjściowych podczas IEnumerable<T> ma tylko Tw pozycjach wyjściowych i IComparable<T> ma Ttylko na wejściu pozycjonuje.

Załóżmy IList<T> obsługiwany typ wariancji: "Przyszłość 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

Dzięki! Wygląda na to, że używanie indeksujących sprawia, że ​​każda klasa jest nie-wariantowa. Ale ICollection <> ma T tylko w parametrach wejściowych. – UserControl

+0

Nie, nie jest on ogólnie związany z indeksami. Zależy od parametrów i typu zwracanych indeksatorów (oraz istnienia akcesorów get/set), tak jak każdej innej metody lub właściwości. Możesz mieć indeksator taki jak: T this [indeks int] {get {return x [index]; }} i bez zestawu accessor może to być wariant. –

1

Anders Hejlseberg ma krótki, ale oświetlające dyskusji opisujący CO/kontrawariancji w rozmowie, Jego dyskusja na temat kowariancji i kontrawariancji rozpoczyna się po 50 minutach i 17 sekundach od prezentacji.

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