IEnumerable<T>
, IComparable<T>
i kilka innych jest teraz wariantami typu. IList<T>
, ICollection<T>
i wiele innych nie jest. Czemu?Wariancja typu w .NET Framework 4.0
6
A
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 T
w pozycjach wyjściowych i IComparable<T>
ma T
tylko 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
}
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.
2
Zobacz także: What C# 4.0 covariance doesn't do
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
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. –