C#变量和常量在溢出期间表现不同.

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)

这里可以看到,默认情况下会检查涉及常量的操作,而未选中涉及变量的操作并通过编译.

为什么编译行为会有所不同?

das*_*ght 6

行为是不同的,因为cMax + 10是一个常量表达式.根据C#语言参考,

常量表达式是一个可以在编译时完全计算的表达式.常量可以参与常量表达式,如下所示:

public const int c1 = 5;  
public const int c2 = c1 + 100;
Run Code Online (Sandbox Code Playgroud)

默认情况下,如果表达式生成的值超出目标类型的范围,则仅包含常量值的表达式会导致编译器错误.如果表达式包含一个或多个非常量值,则编译器不会检测溢出.

因此,编译器必须在编译时计算表达式.由于计算结果无法生成有效值,因此会产生编译时错误.使用checked关键字启用整数溢出检查.