为什么不这样产生溢出异常?(Why doesn't this produce an over

2019-07-31 20:54发布

我是测试出来的东西用LinqPad而感到惊讶的是,下面的代码没有产生异常:

ulong lSmallValue = 5;
ulong lBigValue = 10;

ulong lDifference = lSmallValue - lBigValue;

Console.WriteLine(lDifference);
Console.WriteLine((long)lDifference);

这将产生以下输出:

18446744073709551611
-5

幸运的是,我希望这种行为,但我认为这会导致一个假设下OverflowException抛出。

System.OverflowException

一个发生OverflowException在运行时在下列情况下抛出:

  • 算术运算产生的结果是由操作返回的数据类型的范围之外。
  • 铸造或转换操作尝试执行收缩转换,并且源数据类型的值在目标的数据类型的范围之外。

为什么不操作lSmallValue - lBigValue落入第一类?

Answer 1:

CLR默认不会抛出溢出异常。 除非你使用“检查”的关键字。

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

UPD:其实,我建议由杰弗里里希特表示的“通过C#CLR” - 他让这些东西更加透明。 我最喜欢的书有关CLR和C#的基本面。



Answer 2:

“对于算术,铸造,或转换操作抛出OverflowException异常,必须发生操作checked上下文”。

在发生OverflowException将尽快为你把你的代码检查块中调用。

ulong lSmallValue = 5;
ulong lBigValue = 10;
checked {
try {
    ulong lDifference = lSmallValue - lBigValue;
}
catch (OverflowException) {
    Console.WriteLine("Exception caught");
}}


文章来源: Why doesn't this produce an overflow exception?