IEnumerable<T>
jest kowariancją, ale nie obsługuje typu wartości, tylko typ referencyjny. Poniższy prosty kod został pomyślnie skompilowany:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Ale zmiana z string
na int
spowoduje błąd kompilacji:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Powód jest wyjaśniony w MSDN :
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.
Przeszukałem i stwierdziłem, że w niektórych pytaniach wspomniano, że powodem jest boksowanie między typem wartości a typem odniesienia . Ale to wciąż nie wyjaśnia mi zbytnio, dlaczego powodem jest boks?
Czy ktoś mógłby podać proste i szczegółowe wyjaśnienie, dlaczego kowariancja i kontrawariancja nie obsługują typu wartości i jak wpływa na to boks ?