Почему параметры ковариантного типа не позволяют мне писать [List <object>lst = new List <string>()]? - PullRequest
3 голосов
/ 26 августа 2010

Если параметры типа Ковариант , добавленные в .Net Framework 4, позволяют мне выполнять назначения, похожие на полиморфизм

Почему я могу написать

IEnumerable<object> lst = new List<string>();

А я не могу написать

List<object> lst = new List<string>();

Ответы [ 2 ]

4 голосов
/ 26 августа 2010

Есть две причины, почему это не работает:

  • IEnumerable<T> является ковариантным (объявлено public interface IEnumerable<out T>), но IList<T> - нет. В противном случае вы могли бы сделать что-то подобное:

    IList<string> listOfStrings = ...
    IList<object> listOfObjects = listOfStrings;
    listOfObjects.Add(42); // would fail at runtime because it is actually a list of strings, not ints
    
  • Ковариация и контравариантность работают только на интерфейсах, а не на конкретных классах

От MSDN :

В .NET Framework версии 4 параметры типа варианта ограничены универсальным интерфейсом и универсальными типами делегатов.

2 голосов
/ 26 августа 2010

Поскольку тип List {T} является инвариантом , во втором случае можно будет выполнить:

List<object> lst = new List<string>();
lst.Add(10);

Это недопустимо, поскольку вы добавляете Int32 всписок строк.

Тип IEnumerable {out T} является ковариантным, как следует из 'out'.Это означает, что невозможно добавлять элементы к нему, только получать элементы из него, что делает первый оператор действительным.

Это, однако, действительно:

List<object> lst = new List<object>();
lst.AddRange(new string[] { "hello" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...