Por que a covariância e a contravariância não suportam o tipo de valor
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 mudando destring
paraint
receberá erro compilado:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
A razão é explicada emMSDN:
A variação aplica-se apenas aos tipos de referência; Se você especificar um tipo de valor para um parâmetro de tipo de variante, esse parâmetro de tipo será invariável para o tipo construído resultante.
Eu pesquisei e descobri que algumas questões mencionaram a razão éboxe entre tipo de valor e tipo de referência. Mas isso ainda não esclarece muito minha mente porque o boxe é a razão?
Alguém poderia por favor dar uma explicação simples e detalhada porque covariância e contravariância não suportam o tipo de valor e comoboxe afeta isso?