Ковариантность включается через ключевое слово out и позволяет использовать более производный тип, чем было указано изначально. Это особенно полезно с интерфейсами, которые только возвращают значения.
Например, ты можешь присвоить IEnumerable<Derived> переменной типа IEnumerable<Base>. Это работает потому, что интерфейс только отдаёт данные, поэтому безопасно рассматривать производные типы как их базовые.
IEnumerable<Base> baseCollection = new List<Derived>();
Контравариантность включается через ключевое слово in и позволяет использовать менее производный тип, чем было указано изначально. Это обычно применяется к делегатам и интерфейсам, которые только принимают входные параметры.
Например, действие, принимающее тип Base, можно присвоить делегату, ожидающему тип Derived:
Action<Base> baseAction = Console.WriteLine;
Action<Derived> derivedAction = baseAction;
IInterface<out T> для ковариантности (только вывод) или IInterface<in T> для контравариантности (только ввод)Эти модификаторы вариантности обеспечивают типобезопасность и позволяют гибко присваивать обобщённые типы. Они позволяют твоему коду работать с иерархией типов более естественно — без явного приведения типов и лишних вспомогательных методов.
Ковариантность в C# объявляется с помощью ключевого слова out и позволяет присваивать переменной менее производного типа более производный тип.
Новый — ещё не проверен сообществом
Вы