public IList A23 { get; set; }
s.A23 = new List<int>(new int[] { 62, 63, 64 });
IList g = s.A23;
double d = (double)g[0];
最后一行的双重投射引发异常。 g [0]应该是一个(int的)对象,可以转换为double。
我知道这有效:
double d = (double)(int)g[0];
但那不是我的问题:)。我正在处理超出本文范围的运行时事项。由于来源是IList,我不知道那里的类型。我原本以为编译器可以在不拆箱的情况下将对象转换为int ??
答案 0 :(得分:4)
最后一行的双重投射会引发异常
这是对的。盒装T只能拆箱到T或T?。
我原以为编译器可以在不拆箱的情况下将对象转换为int first
好的,你正在构建一个运行时,所以它将为你构建角色来解决这个问题。 仔细描述您希望编译器发出的代码,记住编译器当然不知道那里有一个int。
非常有用的提示:如果框中的对象键入为动态而不是对象,则转换成双重成功。那是(double)(dynamic)(g[0])
按预期工作。 “动态”只是一个戴着滑稽帽子的“对象”,为什么一个失败而另一个失败?
答案 1 :(得分:2)
不,它不能。取消装箱不是铸造。您需要将变量取消装箱然后再进行转换。在这种特殊情况下,这意味着两个演员。
当您转换为double
时,运行时(不是编译器!)不知道如何将object
转换为double
,也不会尝试将其取消装箱,因为没有什么能说你想要的。事实上,你想要object
被投射,而不是盒装变量是完全合理的。你的代码的意图是模糊的,设计师可能决定完全抛弃它。