IEnumerable<T>
es covariante pero no admite el tipo de valor, solo el tipo de referencia. El siguiente código simple se compila correctamente:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Pero cambiar de string
a int
obtendrá un error compilado:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
La razón se explica en MSDN :
La variación se aplica solo a los tipos de referencia; si especifica un tipo de valor para un parámetro de tipo variante, ese parámetro de tipo es invariable para el tipo construido resultante.
He buscado y encontrado que algunas preguntas mencionan que la razón es el boxeo entre el tipo de valor y el tipo de referencia . Pero todavía no aclara 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 admiten el tipo de valor y cómo el boxeo afecta esto?