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

Pav*_* Nv 5 c# generics

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

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)

O. *_*per 9

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

List<object> objList = (List<object>) strList;
Run Code Online (Sandbox Code Playgroud)

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

objList.Add(new Object());
Run Code Online (Sandbox Code Playgroud)

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

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

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

IEnumerable<object> ienumList = strList;
Run Code Online (Sandbox Code Playgroud)

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


小智 -1

有关协方差和逆变方差的解释,请参阅以下内容。认为它会澄清您遇到的问题:

http://tomasp.net/blog/variance-explained.aspx/

  • 仅链接答案在这里不受欢迎。也许您可以更新您的答案以包含该页面的相关详细信息? (2认同)