Выбор ответа Middle Дженерики обновлено

Ковариантность IEnumerable<out T>

Вопрос

Какая строка скомпилируется?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: IEnumerable<object a = new List<string();. IEnumerable<out T ковариантен: последовательность строк можно читать как последовательность объектов, поэтому первая строка работает.

Варианты ответа

  1. List<object> b = new List<string>();
  2. IList<object> c = new List<string>();
  3. IEnumerable<object> d = new List<int>();
  4. IEnumerable<object> a = new List<string>();правильный ответ

Разбор

IEnumerable<out T> ковариантен: последовательность строк можно читать как последовательность объектов, поэтому первая строка работает. List<T> это класс, а вариантность есть только у интерфейсов и делегатов. IList<T> инвариантен: через него можно записать object в список строк. Для int вариантность не работает: она поддерживается только для ссылочных типов, ведь int пришлось бы упаковать.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.