Почему ковариация и контравариантность не поддерживают тип значения
IEnumerable<T>
являетсяco-variant но он не поддерживает тип значения, только ссылочный тип. Приведенный ниже простой код успешно скомпилирован:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Но меняется отstring
вint
получит скомпилированную ошибку:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Причина объясняется вMSDN:
Variance applies only to reference types; if you specify a value type for a variant type parameter, that type parameter is invariant for the resulting constructed type.
Я искал и обнаружил, что в некоторых вопросах упоминается причинаboxing between value type and reference type, Но это все еще не проясняет мой разум, почему бокс является причиной?
Может ли кто-нибудь дать простое и подробное объяснение, почему ковариация и контравариантность не поддерживают тип значения и какboxing влияет на это?