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 中有解释:
协变性仅适用于引用类型;如果为变体类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。
我搜索并发现一些问题提到了原因是值类型和引用类型之间的装箱(boxing)。但这并没有清楚地解释为什么装箱是原因。
请问能否给出一个简单详细的解释,说明为什么协变性和逆变性不支持值类型,以及装箱如何影响这一点?