¿Por qué la covarianza y la contravarianza no admiten el tipo de valor?
IEnumerable<T>
esco-variante pero no admite el tipo de valor, solo el tipo de referencia. El siguiente código simple se compila exitosamente:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Pero cambiando destring
aint
obtendrá error compilado:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
La razón se explica enMSDN:
La variación se aplica solo a los tipos de referencia; Si especifica un tipo de valor para un parámetro de tipo de variante, ese parámetro de tipo es invariante para el tipo construido resultante.
He buscado y encontrado que algunas preguntas mencionan que la razón esboxeo entre tipo de valor y tipo de referencia. Pero todavía no aclara mucho mi mente, ¿por qué el boxeo es la razón?
¿Podría alguien dar una explicación simple y detallada de por qué la covarianza y la contravarianza no son compatibles con el tipo de valor y cómo?boxeo afecta esto?