Карточка Middle Дженерики обновлено

Ковариантность и контравариантность

Вопрос

Что означают out T и in T в объявлении интерфейса?

Попробуйте сами

Ответьте про себя или вслух, потом откройте ответ и сверьтесь.

Показать ответ и разбор

Коротко

out T (ковариантность): T только на выходе, можно IEnumerable<Cat → IEnumerable<Animal. in T (контравариантность): T только на входе, можно IComparer<Animal → IComparer<Cat. Работает только для интерфейсов и делегатов и только со ссылочными типами.

Ответ

out T (ковариантность): T только на выходе, можно IEnumerable<Cat> → IEnumerable<Animal>. in T (контравариантность): T только на входе, можно IComparer<Animal> → IComparer<Cat>. Работает только для интерфейсов и делегатов и только со ссылочными типами.

Разбор

Массивы в C# ковариантны «по историческим причинам»: object[] a = new string[1]; a[0] = 1; скомпилируется, но упадёт с ArrayTypeMismatchException.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.