Поддерживает ли ковариация в C # 4 вложение дженериков? - PullRequest
5 голосов
/ 21 апреля 2010

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

Ответы [ 2 ]

7 голосов
/ 21 апреля 2010

"z" - это хорошо в C # 4.0, IEnumerable<T> - ковариантный. List<T> однако нет, вы не можете заставить работать "y".

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

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

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

1 голос
/ 22 апреля 2010

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

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

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

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

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