Sam*_*A C 3 c# variables compiler-errors compilation constants
const int cMax = int.MaxValue;
int vMax = cMax;
int int1;
int int2;
int1 = cMax + 10;//Checked amd throws error
int2 = vMax+10;//Unchecked and Overflows at runTime
Run Code Online (Sandbox Code Playgroud)
这里可以看到,默认情况下会检查涉及常量的操作,而未选中涉及变量的操作并通过编译.
为什么编译行为会有所不同?
行为是不同的,因为cMax + 10是一个常量表达式.根据C#语言参考,
常量表达式是一个可以在编译时完全计算的表达式.常量可以参与常量表达式,如下所示:
Run Code Online (Sandbox Code Playgroud)public const int c1 = 5; public const int c2 = c1 + 100;默认情况下,如果表达式生成的值超出目标类型的范围,则仅包含常量值的表达式会导致编译器错误.如果表达式包含一个或多个非常量值,则编译器不会检测溢出.
因此,编译器必须在编译时计算表达式.由于计算结果无法生成有效值,因此会产生编译时错误.使用checked关键字启用整数溢出检查.