在C#中,如果您0/0
遇到异常。
但是,如果您0.0/0
或0.0/0.0
您分别得到double.NaN
和double.Infinity
。
但如果你将这些结果转换为int
,你会得到 0。
> (int)double.PositiveInfinity
0
> (int)double.NaN
0
为什么会这样?运行时不应该给出转换错误,因为无穷大显然不是零吗?
在C#中,如果您0/0
遇到异常。
但是,如果您0.0/0
或0.0/0.0
您分别得到double.NaN
和double.Infinity
。
但如果你将这些结果转换为int
,你会得到 0。
> (int)double.PositiveInfinity
0
> (int)double.NaN
0
为什么会这样?运行时不应该给出转换错误,因为无穷大显然不是零吗?
这取决于你所处的上下文类型。如果你使用checked
上下文,你会得到一个异常。规范的相关部分是第 6.2.1 节:
对于从 float 或 double 到整数类型的转换,处理取决于发生转换的溢出检查上下文(第 7.6.12 节):
- 在检查的上下文中,转换过程如下:
- 如果操作数的值为 NaN 或无穷大,则抛出 System.OverflowException。
- 否则,源操作数向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,那么这个值就是转换的结果。
- 否则,将引发 System.OverflowException。
- 在未经检查的上下文中,转换始终成功,并按如下方式进行。
- 如果操作数的值为 NaN 或无穷大,则转换的结果是目标类型的未指定值。
- 否则,源操作数向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,那么这个值就是转换的结果。
- 否则,转换的结果是目标类型的未指定值。
因此,在未经检查的上下文中,答案不一定是 0 - 它是一个未指定的int
值。事实上,在我的测试中,它int.MinValue
在未经检查的上下文中出现而不是 0。
但从根本上说,如果要进行检查,请使用已检查的上下文(至少对于该表达式)。
这主要是因为 double.NAN 和 double.PositiveInfity (或 double.Negative )不是数字,而是用于识别概念的值。
当操作的结果未定义时,方法或运算符返回 NaN 。例如,零除以零的结果是 NaN,如下例所示。
试试这个来说明这个概念。
if ((0 / zero) == Double.NaN)
Console.WriteLine("0 / 0 can be tested with Double.NaN.");
else
Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");