考虑以下代码段:
int i = 5 / 0;
Run Code Online (Sandbox Code Playgroud)
这给出了编译器错误CS0020:除以常数0,这很好。但是,下一个代码段:
int i = 10;
i = i / 0;
Run Code Online (Sandbox Code Playgroud)
编译就好了。
有人知道为什么吗?我看不出为什么编译器允许将整数变量除以零整数常量。
Phi*_*p C 14
在一般情况下,编译器没有理由在运行时禁止除以零(或任何其他数字)。
但是,您的第一个示例是一个编译时间常数,即它是由编译器计算的,并由评估结果代替。这就是编译器所抱怨的,因为它不知道要用什么整数值代替5/0。
这只是编译时间检查和运行时检查之间的区别。而
i = i / 0;
Run Code Online (Sandbox Code Playgroud)
抛出
System.DivideByZeroException:'试图除以零。
的
i = 5 / 0;
Run Code Online (Sandbox Code Playgroud)
给出编译错误
错误CS0020除以常数零。
的值5 / 0是在编译时评估的,这就是导致接收错误和获取异常之间的区别。
编辑:
给定此处答案的注释,我将花一些时间来编写一个关于为什么编译器以这种方式工作的假设。编译器从未打算防止变量除以零。如果您愿意这样做,则可以这样做,并且可以用一些偷偷摸摸的方法来使程序除以零。编译器应该做的只是在可能的时候进行一些优化,通过计算它来进行微积分并将其替换为结果值。当它看到被零除时,由于无法计算,将给您一个错误。