Выбор ответа Senior Дженерики обновлено
Контравариантность Action<in T>
Вопрос
Какое присваивание корректно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Action<string a = (object o) = Console.WriteLine(o);. Action<in T контравариантен: метод, принимающий любой object, точно справится со строкой, поэтому его можно использовать как Action<string.
Варианты ответа
Action<string> a = (object o) => Console.WriteLine(o);правильный ответAction<object> b = (string s) => Console.WriteLine(s);Func<object> c = () => 42; Func<string> d = c;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 ошибок.