为什么不产生溢出异常?

时间:2012-09-24 19:22:06

标签: c# overflowexception

我正在使用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不属于第一类?

2 个答案:

答案 0 :(得分:11)

CLR默认情况下不会抛出溢出异常。除非您使用“已检查”关键字。

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

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

答案 1 :(得分:0)

"对于抛出OverflowException的算术,转换或转换操作,操作必须在已检查的上下文中进行。"

只要将代码置于已检查的块中,就会调用OverflowException。

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