好吧,我一定忽略了一些非常简单的事情,但我迷路了。
鉴于这种
object val = -1;
var foo = (Int32)(val);
var bar = (Int64)(val);
转换为 Int64 会引发 InvalidCastException。
我知道这与拳击的一些奇怪之处有关,但我不明白其中的原因。
据我了解, val 在第一行被装箱为 Int32 。
然后,当我尝试转换为 Int32 以外的其他内容时,会引发 InvalidCastException 。我想这意味着我试图将 val 拆箱为 Int64,而实际上它是 Int32?
看起来还是很奇怪。转换无法取消该值的装箱然后尝试执行转换吗?
像这样的东西(显然这过于简单化了,也许盒装类型未知,所以这是不可能的?):
object val = -1;
Int32 unboxed = (Int32)(val);
var bar = (Int64)(unboxed);
有人(读:埃里克·利珀特)教我这背后的推理。
UPDATE:从埃里克的博客中,里德发布了一个链接,这就是我一直在寻找的简洁答案
“...这将需要生成大量代码,而且速度非常慢。代码当然太大了,您可能希望将其放入自己的方法中,然后生成对它的调用。而不是默认情况下这样做,并且总是生成缓慢、庞大且脆弱的代码,相反,我们决定拆箱只能拆箱到确切的类型。如果您想调用执行所有这些操作的慢速方法,它是可用的 - 您始终可以调用 Convert.ToInt32,它会在运行时为您执行所有分析。我们让您在“快速而精确”或“缓慢而宽松”之间进行选择,明智的默认值是前者。如果您想要后者,请调用该方法......”