这不行吗? (类型转换/拆箱)

时间:2016-04-15 22:23:51

标签: c#

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 ??

2 个答案:

答案 0 :(得分:4)

  

最后一行的双重投射会引发异常

这是对的。盒装T只能拆箱到T或T?。

  

我原以为编译器可以在不拆箱的情况下将对象转换为int first

好的,你正在构建一个运行时,所以它将为你构建角色来解决这个问题。 仔细描述您希望编译器发出的代码,记住编译器当然不知道那里有一个int。

非常有用的提示:如果框中的对象键入为动态而不是对象,则转换成双重成功。那是(double)(dynamic)(g[0])按预期工作。 “动态”只是一个戴着滑稽帽子的“对象”,为什么一个失败而另一个失败?

答案 1 :(得分:2)

不,它不能。取消装箱不是铸造。您需要将变量取消装箱然后再进行转换。在这种特殊情况下,这意味着两个演员。

当您转换为double时,运行时(不是编译器!)不知道如何将object转换为double,也不会尝试将其取消装箱,因为没有什么能说你想要的。事实上,你想要object被投射,而不是盒装变量是完全合理的。你的代码的意图是模糊的,设计师可能决定完全抛弃它。