IEnumerable<T>
є спільним варіантом, але він не підтримує тип значення, а лише тип посилання. Нижче простий код складено успішно:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Але перейшовши з string
на int
, вийде компільована помилка:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Причина пояснюється в MSDN :
Варіант застосовується лише до еталонних типів; якщо ви задаєте тип значення для параметра варіанту типу, цей параметр типу є інваріантним для отриманого сконструйованого типу.
Я шукав і виявив, що в деяких питаннях згадується причина - бокс між типом значення та типом посилання . Але це ще не дуже зрозуміло, чому саме бокс є причиною?
Чи може хтось, будь ласка, дати просте і детальне пояснення, чому коваріація та протиріччя не підтримують тип значення та як бокс впливає на це?