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?