Я не понимаю, почему 'x' ниже преобразований, но 'y' и 'z' не делают.
var list = new List<List<int>>();
IEnumerable<List<int>> x = list;
List<IEnumerable<int>> y = list;
IEnumerable<IEnumerable<int>> z = list;
Действительно ли новая ковариантность показывает просто не, работают над дженериками дженериков, или я делаю что-то не так? (Я хотел бы избегать использования.Cast <>, чтобы заставить y и z работать.)
«z» подходит для C # 4.0, IEnumerable
является ковариантным. List
, однако, нет, вы не можете заставить "y" работать.
Интуитивно, если бы это было так, это было бы верно:
List<IEnumerable<int>> y = list
y.Add(new Stack<int>());
Что нарушает обещание, что «список» может содержать только List
элементов.
Здесь вы делаете несколько ошибок. Во-первых, ковариация и контравариантность не поддерживаются для типов значений, поэтому все, что вы попытаетесь сделать с "int", не сработает.
Во-вторых, допустимый пример проверки дисперсии во вложенных универсальных типах выглядит примерно так:
var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list;
Я могу назначить List of List строк IEnumerable объектов IEnumerables, что является ковариацией. Для получения дополнительной информации. см. FAQ по ковариации и контравариантности .