Инвариантность, контравариантность, ковариантность

Серия Шлюха программирование

Как шлюхи объясняют ковариантность в C# — запомнишь на всю жизнь (и стыдно будет забыть)! ??

Привет, кодер-неудачник! Ты когда-нибудь путал ковариантность, контравариантность и вообще зачем это всё нужно? Не стесняйся — все мы там бывали. То in, то out, то компилятор орёт, что «cannot convert...», а ты как дурак смотришь на экран и думаешь: «Бля, это же как с этими... шлюхами в том сериале!»

Ну что ж, сегодня я объясню тебе всё на пальцах, но с использованием шлюх. Потому что если не на эмоциях — не запомнишь.

Почему это больно?

В C# есть три сценария работы с типами:

- Ковариантность (out) — когда ты можешь подсунуть более конкретный тип вместо общего.

- Контравариантность (in) — когда ты можешь подсунуть более общий тип вместо конкретного.

- Инвариантность — когда никакой хуйни не будет, только строгий тип.

Звучит как магия? Нет, братан, это проституция в ООП.

Шлюха №1: Ковариантность (out)

Фишка: «Вышла с олигархом — считай, что с мужиком».

Представь:

- У тебя есть шлюха, которая работает только с олигархами (Derived).

- Но ты её записываешь в список «работает с мужиками» (Base).

- Почему можно? Потому что олигарх — это мужик, а не наоборот!

Код для тупых:

class Мужик {}

class Олигарх : Мужик {} // Наследуется, да

IEnumerable<Олигарх- олигархи = new List<Олигарх>();

IEnumerable<Мужик- мужики = олигархи; // Работает! Ковариантность (`out`)

- IEnumerable<T> — ковариантен благодаря out T. Ты выпускаешь (out) олигархов как мужиков.

Мнемоника:

- «Out — шлюха выебала олигарха, считай, что мужика!

- Если вышла с Rolls-Royce — значит, с машиной вышла».

Шлюха №2: Контравариантность (in)

Фишка: «Ебёт мужика — считай, что олигарха».

Теперь:

- У тебя есть шлюха, которая работает со всеми мужиками (Base).

- Ты её нанимаешь для олигархов (Derived).

- Почему можно? Потому что мужик может оказаться олигархом (а не наоборот)!

Код для тупых:

Action<Мужик- обработатьМужика = (m) =- Console.WriteLine("Ебашим мужика");

Action<Олигарх- обработатьОлигарха = обработатьМужика; // Работает! Контравариантность (`in`)

- Action<T> — контравариантен благодаря in T. Ты принимаешь (in) мужиков как олигархов.

Мнемоника:

- «In — шлюха ебёт мужика, считай, что олигарха!

- Если взяла любого в подъезде — может, это Ротенберг».

Шлюха №3: Инвариантность (никакой in/out)

Фишка: «Ты — олигарх? Нет? Тогда вали нахуй!».

А теперь представь самую принципиальную шлюху:

- Она работает ТОЛЬКО с олигархами (Derived).

- Если ты предложишь ей просто мужика (Base) — она скажет: «Ты шо, еблан? У меня контракт только с Ротенбергом!».

- И даже если олигарх придёт — она не согласится считать его «просто мужиком».

Код для тупых:

List<Олигарх- олигархи = new List<Олигарх>();

List<Мужик- мужики = олигархи; // ОШИБКА! Инвариантность.

- List<T> — инвариантен. Нету in/out - никаких преобразований. Тип жёстко фиксирован, как принципы шлюхи после 30.

Мнемоника:

- «Инвариантность — шлюха не ебёт никого, кроме олигархов.

- Ни мужиков, ни бомжей — только паспорт Ротенберга!»

Как не облажаться?

- out = выходи с олигархом, но считай его мужиком - сужение типа (Derived - Base).

- in = входи к мужику, но считай его олигархом - расширение типа (Base - Derived).

- Без in/out = только как в контракте - никаких хитростей (инвариантность).

Лайфхак:

Каждый раз, когда пишешь List<T> или Dictionary<TKey, TValue>, вспоминай:

- «Если шлюха не ставит галочку «подходит для всех мужчин» в профиле — значит, она инвариантна. Ищи другую».

Почему это гениально?

Потому что:

1. Эмоции = память. Ты не забудешь про шлюх, даже если забудешь синтаксис C#.

2. Юмор снимает стресс. Теперь компилятор будет кричать «invariant», а ты улыбнёшься и поправишь код.

3. Ты станешь легендой в команде. «Братан, а как ты запомнил контравариантность?» — «Да шлюхами, чё».

P.S.

Если после этого ты всё равно запутаешься — значит, ты слишком трезвый. Или не смотрел «Горько!».

А если запомнил — ставь лайк, комментируй «Спасибо, теперь шлюхи в моём коде», и не забудь: в C# всё решают контракты... и проститутки. ??

P.P.S. Инвариантность — это когда шлюха сказала: «Ты не Ротенберг? Тогда даже не звони». А ковариантность/контравариантность — это когда она согласна на компромисс. Выбирай, какая тебе ближе.

P.P.P.S. Автор не несёт ответственности за ваши мысли о ковариантности на свиданиях. Но если помогло — пиши в личку, устроим контравариантный квест. ??

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества