【发布时间】:2013-07-08 16:57:29
【问题描述】:
我有以下简短的 C# 程序:
IList<string> listString = new List<String>();
IList<object> listObject;
listObject = listString;
此程序无法编译。最后一行导致以下编译错误:
无法将类型“System.Collections.Generic.IList”隐式转换为“System.Collections.Generic.IList”。 存在显式转换(您是否缺少演员表?)
所以,我添加了演员表:
listObject = (IList<object>)listString;
现在程序可以正确编译,但在运行时失败。引发 InvalidCastException 并带有以下消息:
无法将类型为“System.Collections.Generic.List'1[System.String]”的对象转换为类型“System.Collections.Generic.IList'1[System.Object]”。
强制转换要么是非法的,应该被编译器捕获,要么是合法的,不应该在运行时抛出异常。为什么不一致的行为?
澄清:我不是在问为什么演员阵容失败。我理解为什么这样的选角是有问题的。我在问为什么演员表失败只在运行时。
【问题讨论】:
-
这是一个按章办事的协方差问题。请看stackoverflow.com/questions/5832094/covariance-and-ilist
-
covariance in c#的可能重复
-
并评论您的推理。你在尝试什么在逻辑上是错误的。这就是编译器不喜欢它的原因。尝试通过使用显式强制转换来强制它不会对您有所帮助。使用显式转换就像说“我不在乎这是什么类型,只需编译它”。
-
我在问行为的不一致 - 如果显式转换失败,为什么允许显式转换?
-
@thecoop,这根本不是真的。试试
(double)DateTime.Now,编译器不允许。