4

如果我们在程序中使用以下循环,则循环永远不会在 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);

最近这种行为似乎发生了变化。请参阅问题算术运算导致溢出异常。此更改背后的原因可能是什么?

4

1 回答 1

10

整数(和其他整数类型)的溢出异常仅在checked上下文中完成。

因此,这将导致异常:

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}

默认情况下,它们没有设置为这样做,因为它们比简单的溢出更昂贵。

来自 MSDN:

checked 关键字用于显式启用整数类型算术运算和转换的溢出检查。

和:

溢出检查可以通过编译器选项、环境配置或使用 checked 关键字来启用。


这不是最近的变化——C# 从第一天开始就是这样。您在问题中看到的是 VB.NET 代码,默认情况下它位于已检查的上下文中。

因此,保持默认值,VB.NET 中的溢出代码将引发异常,但 C# 中的相同代码不会。

于 2011-08-19T13:47:10.830 回答