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