C# 4's вложение поддержки ковариантности дженериков?

Я не понимаю, почему '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 работать.)

5
задан Henk Holterman 21 April 2010 в 21:29
поделиться

2 ответа

«z» подходит для C # 4.0, IEnumerable является ковариантным. List , однако, нет, вы не можете заставить "y" работать.

Интуитивно, если бы это было так, это было бы верно:

List<IEnumerable<int>> y = list
y.Add(new Stack<int>());

Что нарушает обещание, что «список» может содержать только List элементов.

7
ответ дан 14 December 2019 в 04:33
поделиться

Здесь вы делаете несколько ошибок. Во-первых, ковариация и контравариантность не поддерживаются для типов значений, поэтому все, что вы попытаетесь сделать с "int", не сработает.

Во-вторых, допустимый пример проверки дисперсии во вложенных универсальных типах выглядит примерно так:

var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list; 

Я могу назначить List of List строк IEnumerable объектов IEnumerables, что является ковариацией. Для получения дополнительной информации. см. FAQ по ковариации и контравариантности .

1
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: