为什么(int)double.NaN和(int)double.PositiveInfinity是0?

Ahm*_*gle 23 c#

C#中,如果0/0你得到一个例外.

但是,如果你0.0/00.0/0.0double.NaNdouble.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.

但从根本上说,如果要进行检查,请使用已检查的上下文(至少对于该表达式).

  • @AppDeveloper:谁说我在记忆中有它?我打开了C#规范并搜索了"数字转换". (2认同)