如果我们在程序中使用以下循环,则循环永远不会在C#4.0中结束
for (int i = 1; i <= int.MaxValue; i++)
{
}
这是因为向int.MaxValue(2147483647)添加1不会导致溢出异常,但会导致-2147483648(考虑到32位int和2的补充)。
int i = int.MaxValue;
Console.WriteLine(i + 1);
最近行为似乎发生了变化。 See the question Arithmetic operation caused OverflowException。这种变化背后的原因是什么?
答案 0 :(得分:9)
整数(和其他整数类型)的溢出异常仅在checked
上下文中完成。
所以,这会导致异常:
checked
{
int i = int.MaxValue;
Console.WriteLine(i + 1);
}
默认情况下,它们不会设置为执行此操作,因为它们比简单溢出更昂贵。
来自MSDN:
checked关键字用于显式启用对整数类型算术运算和转换的溢出检查。
和
可以通过编译器选项,环境配置或使用checked关键字来启用溢出检查。
这不是最近的变化 - 从第一天起C#就是这样的。您在问题中看到的是VB.NET代码,默认情况下是在已检查的上下文中。
因此,保持默认值,VB.NET中的代码溢出会引发异常,但C#中的相同代码不会。
答案 1 :(得分:2)