IEnumerable<T>
является со-вариантом, но он не поддерживает тип значения, а только тип ссылки. Следующий простой код скомпилирован успешно:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Но изменение с string
до int
приведет к ошибке компиляции:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Причина объясняется в MSDN:
Отклонение применяется только к ссылочным типам; если вы укажете тип значения для параметра типа варианта, этот тип параметра является инвариантным для результирующего построенного типа.
Я искал и обнаружил, что в некоторых вопросах упоминается причина бокса между типом значения и ссылочным типом. Но это еще не все еще ясно, почему бокс является причиной?
Может ли кто-нибудь дать простое и подробное объяснение, почему ковариация и контравариантность не поддерживают тип ценности и как влияет на это бокс?