在编译时评估

Run*_*Run 0 .net c# c#-4.0

两个例子有什么区别?

示例1: int x = int.MaxValue + 1; // Compile-time error

实施例2; int x = int.MaxValue; x = x + 1; // no Compile-time error

《A Nutshell》一书的作者谈到第一个例子时说,在编译时计算的表达式总是进行溢出检查。

我不明白第一个例子和第二个例子之间的区别。两者都不是在编译时评估的,所以两者都应该产生相同的错误吗?

D S*_*ley 5

int.MaxValue是一个常量值,因此编译器可以计算int.MaxValue + 1并确定它溢出了 的范围int

编译器不够复杂,无法知道、计算并确定它是否溢出。xint.MaxValuex + 1

编译器不会“评估”第二个 - 它只是将表达式转换为程序运行时评估的等效 IL 代码(这显然会在运行时溢出)。

如果第一个示例使用未溢出的常量表达式(例如int.MaxValue - 1),则编译器可以用 IL 中常量表达式的结果替换该表达式。

这就是“在编译时评估”的全部含义