Понимание ковариантного и контравариантного интерфейсов в C #

Я сталкивался с этим в учебнике, который я читаю на C #, но мне трудно их понять, возможно, из-за отсутствия контекста.

Есть ли хорошее краткое объяснение того, чем они являются и для чего они там полезны?

Изменить для уточнения:

Ковариантный интерфейс:

interface IBibble<out T>
.
.

Контравариантный интерфейс:

interface IBibble<in T>
.
.

Ответы на вопрос(2)

Ваш ответ на вопрос