为什么int i = 10; i / 0;编译,但5/0给出CS0020-除以常数零?

时间:2019-03-22 12:38:11

标签: c#

请考虑以下代码段:

int i = 5 / 0;

这会导致编译器错误 CS0020:被常数零除,这很好。但是,下一个代码段:

int i = 10;
i = i / 0;

编译正常。

有人知道为什么吗?我看不出为什么编译器允许将整数变量除以零整数常量。

4 个答案:

答案 0 :(得分:14)

在一般情况下,编译器没有理由在运行时禁止除以零(或任何其他数字)。

但是,

您的第一个示例是一个编译时间常量,即它是由编译器计算的,并由求值结果代替。这就是编译器所抱怨的,因为它不知道要用什么整数值代替5/0。

答案 1 :(得分:7)

这只是编译时间检查和运行时检查之间的区别。虽然

i = i / 0;

投掷

  

System.DivideByZeroException:“试图除以零。”

i = 5 / 0;

出现编译错误

  

错误CS0020除以常数0。

5 / 0的值是在编译时求值的,这就是接收错误和获取异常之间的区别。

编辑:

考虑到这里答案的注释,我将花一些时间编写一个假设,说明编译器为何以这种方式工作。编译器从未打算防止变量除以零。如果您愿意这样做,则可以这样做,并且可以用一些偷偷摸摸的方法来使程序除以零。编译器应该做的只是在可能的时候进行一些优化,通过计算它来进行微积分并将其替换为结果值。当它看到被零除时,由于无法计算,因此只会给您一个错误。

答案 2 :(得分:3)

由于编译器将int i = 5 / 0;转换为常数值,因此它必须在编译时计算该值,这会导致错误。

但是代码

int i = 10;
i = i / 0;

在形式上是正确的。它会引发异常,这是您的决定以及生成此类异常的意图。

答案 3 :(得分:0)

与每个人在这里所说的一样。 这行是编译时间,因为编译器不知道答案,这会给出错误

int i = 5 / 0;

这行是运行时检查,它只是一般的数学计算,因此编译器没有理由将其抛出错误

 int i = 10;
 i = i / 0;