Dlaczego kowariancja i kontrawariancja nie obsługują typu wartości

IEnumerable<T> jestwariant wariantowy ale nie obsługuje typu wartości, tylko typ odniesienia. Poniższy prosty kod jest kompilowany pomyślnie:

IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;

Ale zmiana zstring doint dostanie skompilowany błąd:

IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;

Powód jest wyjaśniony wMSDN:

Wariancja dotyczy tylko typów referencyjnych; jeśli określisz typ wartości dla parametru typu wariantu, ten parametr typu jest niezmienny dla wynikowego typu skonstruowanego.

Szukałem i stwierdziłem, że niektóre pytania wspominają o przyczynieboks między typem wartości a typem odniesienia. Ale to jeszcze nie wyjaśnia, dlaczego boks jest powodem?

Czy ktoś mógłby podać proste i szczegółowe wyjaśnienie, dlaczego kowariancja i kontrawariancja nie obsługują typu wartości i jakboks wpływa na to?

questionAnswers(4)

yourAnswerToTheQuestion