TGViewer
StepOne | Степан Минин StepOne | Степан Минин @steponeit · 3.27K subscribers
Post #235 2.35K
Контравариантность и ковариантность 🧠

В одном из профильных чатов видел сообщение о том, что упомянутая в заголовке тема даётся чуть ли не сложнее всего, что входит в основы C#.

Иногда, кажется проще запомнить наглядно, на примерах.

Также, стоит упомянуть, что всё нижеописанное актуально именно в дженериках.

Контравариантность ⬆️

Возможность подставить более базовый тип на место формального типового параметра, которая используется для объявления аргументов функций:

interface IFooIn<in TInputType>
{
void Bar(TInputType input);
}


Пример из стандартной библиотеки - IComparable<>, где благодаря контравариантности можно сделать так:

IComparable<IEnumerable<char>> charEnumerableComparable = // ...;

// ...

IComparable<string> stringComparable = charEnumerableComparable;


Ковариантность ⬇️

Возможность подставить более производный тип на место формального типового параметра, которая используется для объявления возврата значений из функций:

interface IFooOut<out TOutputType>
{
TOutputType Baz();
}


Пример из стандартной библиотеки - IEnumerable<>, где благодаря ковариантности можно сделать так:

IEnumerable<Task<object>> tasksWithResults = // ...;

// ...

IEnumerable<Task> tasks = tasksWithResults;


Дополнительно 🤓

Во-первых, первое и второе можно совмещать в рамках одного типа:

interface IFooInOut<in TInputType, out TOutputType>
{
TOutputType Foo(TInputType input);
}


Во-вторых, это очень мощный инструмент на стыке параметрического полиморфизма и полиморфизма подтипов, который позволяет строить мощные расширяемые и универсальные системы типов.

В-третьих, самый смак этой фичи в том, что кастинг, который был показан выше, в силу своей неявности по перфомансу равен отсутствию кастинга, поскольку в результирующем IL отсутствуют инструкции castclass.
  • 🤯 9
  • 🔥 7
  • 👍 5
  • ❤ 2
More from @steponeit
  1. Sep 29, 2026Рассказал как автоматизировал сборку лексера компилятором для своего языка программировани…
  2. Sep 28, 2026Пошутил про джавистов в прямом эфире 😅 Шарпизм победил окончательно и бесповоротно!
  3. Sep 27, 2026Post #860
  4. Sep 25, 2026Рассказал как я добавил в HydraScript объекты и методы без классов и сделал протоколы. Стр…
  5. Sep 22, 2026Post #858
  6. Sep 21, 2026Post #857
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →