为什么不产生溢出异常?

Ant*_*ony 5 c# overflowexception

我正在使用LinqPad测试一些东西,并惊讶于以下代码没有产生异常:

ulong lSmallValue = 5;
ulong lBigValue = 10;

ulong lDifference = lSmallValue - lBigValue;

Console.WriteLine(lDifference);
Console.WriteLine((long)lDifference);
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

18446744073709551611
-5
Run Code Online (Sandbox Code Playgroud)

幸运的是,我希望这种行为,但我认为这会导致OverflowException被抛出.

来自System.OverflowException:

在以下条件下,在运行时抛出OverflowException:

  • 算术运算产生的结果超出了操作返回的数据类型的范围.
  • 转换或转换操作尝试执行缩小转换,并且源数据类型的值超出目标数据类型的范围.

为什么操作不lSmallValue - lBigValue属于第一类?

Mik*_*ail 11

默认情况下,CLR不会抛出溢出异常.除非您使用"checked"关键字.

http://msdn.microsoft.com/en-us/library/74b4xzyw%28v=vs.71%29.aspx

UPD:实际上,我确实推荐Jeffrey Richter的"CLR via C#" - 他让这些事情变得更加透明.我最喜欢的关于CLR和C#基础知识的书.

  • 这实际上会导致抛出异常.谢谢,我以前从未遇到过`checked`关键字. (2认同)