我试图弄清楚为什么在第一种情况下不能进行类型转换,但在第二种情况下它是可能的.请看下面的代码:
var strList = new List{"One", "Two", "Three"}; List
O. R. Mapper.. 9
虽然关于协方差和逆变的评论对基本原则提出了一个很好的观点,但我将回答所提出案例中的具体影响:
ListobjList = (List ) strList;
objList
是可写的.它允许你这样做:
objList.Add(new Object());
但是,objList
仍然是同一个例子strList
.你刚才说的一个实例System.Object
到List
!
编译器不允许这种情况发生.因此,一个List
不能被铸造成List
.
另一方面,在第二种情况下,您检索一个可枚举的:
IEnumerableienumList = strList;
无法修改生成的可枚举,因为IEnumerable
没有提供任何改变实例的成员.因此,类型参数T
可以(并且)用out
关键字标记,这允许呈现的类型转换.
虽然关于协方差和逆变的评论对基本原则提出了一个很好的观点,但我将回答所提出案例中的具体影响:
ListobjList = (List ) strList;
objList
是可写的.它允许你这样做:
objList.Add(new Object());
但是,objList
仍然是同一个例子strList
.你刚才说的一个实例System.Object
到List
!
编译器不允许这种情况发生.因此,一个List
不能被铸造成List
.
另一方面,在第二种情况下,您检索一个可枚举的:
IEnumerableienumList = strList;
无法修改生成的可枚举,因为IEnumerable
没有提供任何改变实例的成员.因此,类型参数T
可以(并且)用out
关键字标记,这允许呈现的类型转换.