System.OverflowException 在未经检查的 C# 块中

System.OverflowException in unchecked block of C#

如果我将 Int32.MinValue 和 -1 传递给 Divide() 方法,我会得到一个 System.OverflowException,尽管该块发生在 unchecked 块中。

    private static int Divide(int n, int d)
    {
        return unchecked (n / d);
    }

这让我感到惊讶 - 除非我错误地阅读了 documentation 的选中/未选中,否则我希望它只会给我一个溢出的输出(因为 Int32.MinValue / -1 = 2^31 = Int32.MaxValue + 1,我期望溢出到 Int32.MinValue 的值)。相反,它抛出了 OverflowException.

这里 DotNetFiddle 显示了这个问题。

From the C# draft specification on integer division:

If the left operand is the smallest representable int or long value and the right operand is -1, an overflow occurs. In a checked context, this causes a System.ArithmeticException (or a subclass thereof) to be thrown. In an unchecked context, it is implementation-defined as to whether a System.ArithmeticException (or a subclass thereof) is thrown or the overflow goes unreported with the resulting value being that of the left operand.

我不确定微软在哪里列出了它对实现定义行为的选择,但显然他们在这里选择了第一个选项。

ECMA-334 的附件 B 中列出了这个和其他实现定义或未定义的行为。 上面的draft specification是最近更新的,但是好像少了这个附件