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 :
Дисперсия применяется только к ссылочным типам; если вы указываете тип значения для параметра типа варианта, этот параметр типа является инвариантным для результирующего составного типа.
Я искал и обнаружил, что в некоторых вопросах упоминается причина - бокс между типом значения и ссылочным типом . Но это все еще не проясняет мой разум, почему бокс является причиной?
Может ли кто-нибудь дать простое и подробное объяснение, почему ковариация и контравариантность не поддерживают тип значения и как бокс влияет на это?