IEnumerable<T>
est co-variant mais il ne prend pas en charge le type valeur, seulement le type référence. Le code simple ci-dessous est compilé avec succès:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Mais changer de string
à int
entraînera une erreur de compilation:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
La raison est expliquée dans MSDN :
La variance s'applique uniquement aux types de référence; si vous spécifiez un type valeur pour un paramètre de type variant, ce paramètre de type est invariant pour le type construit résultant.
J'ai recherché et trouvé que certaines questions mentionnaient que la raison était la boxe entre le type de valeur et le type de référence . Mais cela ne m'éclaircit pas encore beaucoup pourquoi la boxe est la raison?
Quelqu'un pourrait-il donner une explication simple et détaillée pourquoi la covariance et la contravariance ne prennent pas en charge le type de valeur et comment la boxe affecte cela?