看下面的代码,我只是想了解背后的原因......
const int a = 2147483647;
const int b = 2147483647;
int c = a + b; // it doesn't allow to compile!!!
int a = 2147483647;
int b = 2147483647;
int c = a + b; // it allows to compile!!!
Run Code Online (Sandbox Code Playgroud)
const表达式在编译时解析,非const表达式在运行时解析。默认情况下,每个都有不同类型的溢出检查上下文。根据C#规范:
对于未包含在任何已检查或未检查运算符或语句中的非常量表达式(在运行时计算的表达式),默认的溢出检查上下文是未检查的 ,除非外部因素(例如编译器切换和执行环境配置)调用检查评价。
这就是为什么当您使用局部变量进行算术时没有看到运行时错误。至于const计算:
对于常量表达式(可以在编译时完全求值的表达式),始终检查默认的溢出检查上下文。除非将常量表达式显式放置在未经检查的上下文中,否则在表达式的编译时求值期间发生的溢出总是会导致编译时错误。
这就是您在计算中看到编译时错误的原因const。