这不应该行吗?(打字/拆箱)

本文关键字:打字 拆箱 不应该 | 更新日期: 2024-09-19 19:03:27

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] 应该是一个对象(整数(,可转换为双精度对象。

我知道这有效:

double d = (double)(int)g[0];

但这不是我的问题:)。我正在研究一个运行时的事情,这超出了这篇文章的范围。由于来源是 IList,我不知道那里的类型。我本以为编译器可以在不首先将拆箱的情况下将对象转换为 int??

这不应该行吗?(打字/拆箱)

最后一行的双重强制转换引发异常

没错。盒装 T 只能拆箱为 T 或 T?。

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

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

非常有用的提示:如果盒装对象类型为动态而不是对象,则强制转换为双精度成功。 这就是(double)(dynamic)(g[0])按预期工作。 "动态"只是戴着滑稽帽子的"对象",那么为什么一个失败而另一个成功呢?

不,它不能。拆箱不是铸造。您需要将变量拆箱,然后将其强制转换。在这种特殊情况下,这意味着两个转换。

当你投射到double运行时(不是编译器!(不知道如何将object投射到double,也不会尝试将其拆箱,因为没有什么说你想要的。事实上,您希望强制转换object而不是盒装变量是完全合理的。代码的意图是模棱两可的,设计人员可能已经决定完全抛弃它。