将int.MaxValue赋值给变量时,编译器会有不同的响应

时间:2016-03-09 13:39:50

标签: c#

根据documentation int.MaxValue是一个int字段。当我做的时候

int a = int.MaxValue;
int b = a + 1;

b的值为int.MinValue,符合预期。但是当我做的时候

int a = int.MaxValue + 1;

我收到编译错误

  

操作在编译时以检查模式溢出

为什么会有区别?

3 个答案:

答案 0 :(得分:2)

来自https://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx

  

constant-expression是一个可以在编译时完全评估的表达式。

  

每当表达式是上面列出的类型之一并且仅包含上面列出的结构时,表达式在编译时计算。

  

除非在未经检查的上下文中显式放置常量表达式,否则在表达式的编译时评估期间在整数类型算术运算和转换中发生的溢出总是会导致编译时错误

这就解释了为什么int a = int.MaxValue + 1;会出现编译错误(int.MaxValueconst int)。

int a = int.MaxValue;
int b = a + 1;

是不同的,因为它不是常量表达式。它们是两个非常量变量(参见并且只包含上面列出的结构?显然声明中间变量不是可接受的结构之一:-))

答案 1 :(得分:2)

不同之处在于,在第一行中,您添加了两个常量。 int.MaxValue是常数,1也是常数。因此,编译器在编译时进行计算,并在此警告时失败。

第二行将产生相同的行为,但在运行时,因为您已经引入了变量,并且您的编译器没有足够的优化它来在编译时进行计算时间。

答案 2 :(得分:1)

你的编译器可能使用checked选项(这是一个默认选项),它说;

  

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

由于int.MaxValue1都是常量,因此您会收到错误。

如果您使用unchecked选项,则会看到相同的结果

unchecked
{
    int a = int.MaxValue + 1; // a is int.MinValue
}