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