我试图弄清楚为什么在第一种情况下不能进行类型转换,但在第二种情况下它是可能的.请看下面的代码:
var strList = new List<string>{"One", "Two", "Three"};
List<object> objList = (List<object>) strList; // <<<< why is not converted? - Case 1
IEnumerable<object> ienumList = strList; // <<<< why is converted? - Case 2
Run Code Online (Sandbox Code Playgroud)
虽然关于协方差和逆变的评论对基本原则提出了一个很好的观点,但我将回答所提出案例中的具体影响:
Run Code Online (Sandbox Code Playgroud)List<object> objList = (List<object>) strList;
objList是可写的.它允许你这样做:
objList.Add(new Object());
Run Code Online (Sandbox Code Playgroud)
但是,objList仍然是同一个例子strList.你刚才说的一个实例System.Object到List<string>!
编译器不允许这种情况发生.因此,一个List<string>不能被铸造成List<object>.
另一方面,在第二种情况下,您检索一个可枚举的:
Run Code Online (Sandbox Code Playgroud)IEnumerable<object> ienumList = strList;
无法修改生成的可枚举,因为IEnumerable<T>没有提供任何改变实例的成员.因此,类型参数T可以(并且)用out关键字标记,这允许呈现的类型转换.
小智 -1
有关协方差和逆变方差的解释,请参阅以下内容。认为它会澄清您遇到的问题:
http://tomasp.net/blog/variance-explained.aspx/