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中进行了解释:
方差仅适用于引用类型;如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型而言是不变的。
我搜索后发现,提到的一些问题的原因是值类型和引用类型之间的装箱。但这仍不能使我清楚为何拳击是原因?
有人可以给出一个简单而详细的解释,为什么协变量和协变量不支持值类型,以及装箱如何影响值类型?