IEnumerable<T>
es covariant mais il ne prend pas en charge le type de valeur, seulement le type de référence. Le code simple ci-dessous est compilé avec succès :
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Mais passer de string
a int
obtiendra une erreur de compilation :
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
La raison en est expliquée dans MSDN :
La variance ne s'applique qu'aux types de référence ; si vous spécifiez un type de valeur pour un paramètre de type variant, ce paramètre de type est invariant pour le type construit résultant.
J'ai cherché et trouvé que certaines questions mentionnaient que la raison est la boxe entre le type de valeur et le type de référence . Mais je n'ai pas encore bien compris pourquoi la boxe est la raison ?
Quelqu'un pourrait-il expliquer de façon simple et détaillée pourquoi la covariance et la contravariance ne supportent pas le type de valeur et comment boxe affecte cela ?
3 votes
Voir également la réponse d'Eric à ma question similaire : stackoverflow.com/questions/4096299/
1 votes
Duplicata possible de cant-convert-value-type-array-to-params-object