当前位置:  开发笔记 > 编程语言 > 正文

C#中通用列表的类型转换

如何解决《C#中通用列表的类型转换》经验,为你挑选了1个好方法。

我试图弄清楚为什么在第一种情况下不能进行类型转换,但在第二种情况下它是可能的.请看下面的代码:

var strList = new List{"One", "Two", "Three"};
List objList = (List) strList; // <<<< why is not converted? - Case 1

IEnumerable ienumList = strList; // <<<< why is converted?  - Case 2

O. R. Mapper.. 9

虽然关于协方差和逆变的评论对基本原则提出了一个很好的观点,但我将回答所提出案例中的具体影响:

List objList = (List) strList;



objList是可写的.它允许你这样做:

objList.Add(new Object());

但是,objList仍然是同一个例子strList.你刚才说的一个实例System.ObjectList!

编译器不允许这种情况发生.因此,一个List不能被铸造成List.

另一方面,在第二种情况下,您检索一个可枚举的:

IEnumerable ienumList = strList;



无法修改生成的可枚举,因为IEnumerable没有提供任何改变实例的成员.因此,类型参数T可以(并且)用out关键字标记,这允许呈现的类型转换.



1> O. R. Mapper..:

虽然关于协方差和逆变的评论对基本原则提出了一个很好的观点,但我将回答所提出案例中的具体影响:

List objList = (List) strList;



objList是可写的.它允许你这样做:

objList.Add(new Object());

但是,objList仍然是同一个例子strList.你刚才说的一个实例System.ObjectList!

编译器不允许这种情况发生.因此,一个List不能被铸造成List.

另一方面,在第二种情况下,您检索一个可枚举的:

IEnumerable ienumList = strList;



无法修改生成的可枚举,因为IEnumerable没有提供任何改变实例的成员.因此,类型参数T可以(并且)用out关键字标记,这允许呈现的类型转换.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有