Карточка 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 ошибок.