5

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

ulong lSmallValue = 5;
ulong lBigValue = 10;

ulong lDifference = lSmallValue - lBigValue;

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

这会产生以下输出:

18446744073709551611
-5

幸运的是,我希望有这种行为,但我假设这会导致 anOverflowException被抛出。

来自System.OverflowException

在以下情况下,会在运行时引发 OverflowException:

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

为什么手术不lSmallValue - lBigValue属于第一类?

4

2 回答 2

11

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

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

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

于 2012-09-24T19:26:07.373 回答
0

“对于引发溢出异常的算术、强制转换或转换操作,该操作必须发生在检查的上下文中。”

一旦您将代码放入已检查的块中,就会调用 OverflowException。

ulong lSmallValue = 5;
ulong lBigValue = 10;
checked {
try {
    ulong lDifference = lSmallValue - lBigValue;
}
catch (OverflowException) {
    Console.WriteLine("Exception caught");
}}
于 2012-09-24T19:25:37.287 回答