Типовая дисперсия в .NET Framework 4.0 - PullRequest
6 голосов
/ 31 мая 2009

IEnumerable<T>, IComparable<T> и некоторые другие теперь являются вариантами типа. IList<T>, ICollection<T> и многие другие нет. Почему?

Ответы [ 3 ]

11 голосов
/ 31 мая 2009

.NET Framework 4.0 представляет safe co / contra-variance. IList<T> и ICollection<T> имеют T во входных и выходных позициях, в то время как IEnumerable<T> имеет T только в выходных позициях , а IComparable<T> имеет T только во входных позициях .

Предположим, IList<T> поддерживаемая дисперсия типов:

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
}
2 голосов
/ 01 июня 2009
1 голос
/ 31 мая 2009

У Андерса Хейлсеберга есть краткое, но интересное обсуждение, которое описывает со / противоречие в его выступлении «Будущее C #». Его обсуждение ковариации и контравариантности начинается через 50 минут 17 секунд после презентации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...