Общий разброс в С# 4.0 был реализован таким образом, что можно было написать следующее без исключения (что будет в С# 3.0):
List<int> intList = new List<int>();
List<object> objectList = intList;
[Пример нерабочий: см. ответ Jon Skeet]
Недавно я присутствовал на конференции, где Джон Скит дал отличный обзор Generic Variance, но я не уверен, что полностью его понимаю - я понимаю значение ключевых слов in
и out
, когда это происходит для противоречия и со-дисперсии, но мне любопытно, что происходит за кулисами.
Что показывает CLR, когда этот код выполняется? Является ли он неявным преобразованием List<int>
в List<object>
или он просто построен в том, что теперь мы можем преобразовать между производными типами в родительские типы
Из интереса, почему это не было введено в предыдущих версиях и какое основное преимущество - то есть использование в реальном мире?
Дополнительная информация по этому сообщению для общей дисперсии (но вопрос крайне устарел, ища настоящую актуальную информацию)