IEnumerable<T>
é co-variante, mas não suporta o tipo de valor, apenas o tipo de referência. O código simples abaixo é compilado com sucesso:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Mas mudar de string
para int
receberá um erro compilado:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
O motivo é explicado no MSDN :
A variação se aplica apenas a tipos de referência; se você especificar um tipo de valor para um parâmetro de tipo variante, esse parâmetro de tipo será invariável para o tipo construído resultante.
Pesquisei e descobri que algumas perguntas mencionavam o motivo do boxe entre o tipo de valor e o tipo de referência . Mas ainda não me lembro muito bem por que o boxe é a razão?
Alguém poderia dar uma explicação simples e detalhada por que covariância e contravariância não suportam o tipo de valor e como o boxe afeta isso?