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

Контравариантность Action<in T>

Вопрос

Какое присваивание корректно?

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

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

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

Коротко

Правильный ответ: Action<string a = (object o) = Console.WriteLine(o);. Action<in T контравариантен: метод, принимающий любой object, точно справится со строкой, поэтому его можно использовать как Action<string.

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

  1. Action<string> a = (object o) => Console.WriteLine(o);правильный ответ
  2. Action<object> b = (string s) => Console.WriteLine(s);
  3. Func<object> c = () => 42; Func<string> d = c;
  4. Func<object, string> e = (string s) => s;

Разбор

Action<in T> контравариантен: метод, принимающий любой object, точно справится со строкой, поэтому его можно использовать как Action<string>. Обратное неверно: метод для строк не умеет обработать произвольный объект. Func<out TResult> ковариантен по результату, а object не превращается в string. Параметр Func<in T, out TResult> контравариантен, и метод для string не подходит как метод для object.

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

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