IEnumerable<T>
ist eine Co-Variante, unterstützt jedoch keinen Werttyp, sondern nur einen Referenztyp. Der folgende einfache Code wurde erfolgreich kompiliert:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Beim Wechsel von string
zu int
wird jedoch ein kompilierter Fehler angezeigt:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Der Grund wird in MSDN erklärt :
Die Abweichung gilt nur für Referenztypen. Wenn Sie einen Werttyp für einen Variantentypparameter angeben, ist dieser Typparameter für den resultierenden konstruierten Typ unveränderlich.
Ich habe gesucht und festgestellt, dass einige Fragen den Grund für das Boxen zwischen Werttyp und Referenztyp genannt haben . Aber es klärt mich immer noch nicht auf, warum Boxen der Grund ist?
Könnte jemand bitte eine einfache und detaillierte Erklärung geben, warum Kovarianz und Kontravarianz den Werttyp nicht unterstützen und wie sich das Boxen darauf auswirkt?