Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 被拳击弄糊涂了。将-1强制转换为Int64将抛出InvalidCastException_C#_.net_Language Design_Language Features - Fatal编程技术网

C# 被拳击弄糊涂了。将-1强制转换为Int64将抛出InvalidCastException

C# 被拳击弄糊涂了。将-1强制转换为Int64将抛出InvalidCastException,c#,.net,language-design,language-features,C#,.net,Language Design,Language Features,好吧,我一定忽略了一些非常简单的事情,但我迷路了 鉴于此 object val = -1; var foo = (Int32)(val); var bar = (Int64)(val); 对Int64的强制转换抛出和InvalidCastException 我认识到这与拳击的一些奇怪之处有关,但我不明白其中的道理 据我所知,val在第一行被装箱为Int32 然后,当我尝试强制转换为Int32以外的内容时,会抛出InvalidCastException。我想这意味着当val实际上是Int32时,

好吧,我一定忽略了一些非常简单的事情,但我迷路了

鉴于此

object val = -1;
var foo = (Int32)(val);
var bar = (Int64)(val);
对Int64的强制转换抛出和InvalidCastException

我认识到这与拳击的一些奇怪之处有关,但我不明白其中的道理

据我所知,val在第一行被装箱为Int32

然后,当我尝试强制转换为Int32以外的内容时,会抛出InvalidCastException。我想这意味着当val实际上是Int32时,我试图将其取消装箱为Int64

看起来还是很奇怪。转换不能取消对值的装箱,然后尝试执行转换吗

类似于(显然这过于简单化了,可能是盒装类型未知,所以这是不可能的?)

有人(读:埃里克·利珀特)教我这背后的道理

更新:在Eric的博客中,Reed发布了一个指向此的链接,这就是我想要的简洁答案


“…这将需要生成大量代码,而且速度非常慢。当然,代码太大了,您可能希望将其放在自己的方法中,然后生成对它的调用。与默认情况下那样做不同,我们总是生成缓慢、庞大和脆弱的代码,相反,我们决定取消装箱只能取消装箱到确切的类型。如果您想调用执行所有这些操作的慢速方法,它是可用的–您可以始终调用Convert.ToInt32,它在运行时为您进行所有分析。我们让你在“快速而精确”或“缓慢而宽松”之间做出选择,明智的违约是前者。如果需要后者,则调用方法…“

这是因为无法在单个操作中取消装箱并执行转换。必须将Int32值取消装箱为Int32,然后再转换其类型

因此,这要求对象解除绑定,然后转换为Int64:

object val = -1;
int foo = (Int32)val;
Int64 bar = (Int64)(Int32)val;

Eric Lippert在他的博客文章中详细介绍了这一点。

这是一件非常不简单的事情。它让很多人都感到困惑……里德是对的;这一点每周都会被问几次。昨天被问了两次。所以,我显然是跛脚的,因为我问了所有人都问的问题,而不是先搜索。我觉得很有趣如果这是一个如此常见的问题,它仍然获得6票。显然默认行为并不是最明显的行为。太棒了,Eric Lippert by proxy:)你可以用另一种方式写:
Int64 a=-1;object o=a;Int64 b=(Int64)o;
谢谢里德!当人们想要转换时,请停止说cast好吗?没有整数类型之间的“强制转换”;它们正在被转换。(不幸的是,C#对这两种类型使用相同的语法。)@Timwi:我同意你的观点,但你正在进行一场艰苦的战斗。我更倾向于保留“强制转换”是指代码中强制转换运算符的实际编译时文本,以及“转换”“用于将一种类型转换为另一种类型的运行时操作。但大多数人并不这样区分。
object val = -1;
int foo = (Int32)val;
Int64 bar = (Int64)(Int32)val;