在C#中,如果0/0你得到一个例外.
但是,如果你0.0/0或0.0/0.0你double.NaN和double.Infinity分别.
但如果将这些结果投射到int,则得到0.
> (int)double.PositiveInfinity
0
> (int)double.NaN
0
Run Code Online (Sandbox Code Playgroud)
为什么会这样?是不是运行时应该给出转换错误,因为无穷大显然不是零?
Jon*_*eet 15
这取决于你所处的上下文类型.如果你使用checked上下文,你会得到一个例外.规范的相关部分是6.2.1节:
对于从float或double到整数类型的转换,处理取决于转换发生的溢出检查上下文(第7.6.12节):
- 在已检查的上下文中,转换过程如下:
- 如果操作数的值为NaN或无穷大,则抛出System.OverflowException.
- 否则,源操作数向零舍入为最接近的整数值.如果此整数值在目标类型的范围内,则此值是转换的结果.
- 否则,抛出System.OverflowException.
- 在未经检查的上下文中,转换始终成功,并按如下方式进行.
- 如果操作数的值为NaN或无穷大,则转换的结果是目标类型的未指定值.
- 否则,源操作数向零舍入为最接近的整数值.如果此整数值在目标类型的范围内,则此值是转换的结果.
- 否则,转换的结果是目标类型的未指定值.
因此,在一个未经检查的情况下,答案是不是一定0 -这是一个未指定的int值.实际上,在我的测试中,它int.MinValue在未经检查的上下文中出现而不是0.
但从根本上说,如果要进行检查,请使用已检查的上下文(至少对于该表达式).