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?

questionAnswers(4)

yourAnswerToTheQuestion