在检查块中调用的方法中没有溢出异常

No overflow exception in a method called in checked block

checked 块用于确保是否发生溢出,是否抛出异常。例如,

下面的代码抛出溢出异常没问题。

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(a * b);
}

但是如果我在 checked 块中调用一个方法,而该方法又包含抛出溢出异常的代码,checked 块似乎没有检测到这一点。是否也可以检测到这些。

checked
{
  int a = 123456;
  int b = 123456;
  Console.WriteLine(Mul(a, b));
}

public int Mul(int a, int b)
{
  return a * b;
}

此博客 post 对此主题进行了一些解释:

https://devblogs.microsoft.com/oldnewthing/20140815-00/?p=233

简而言之:一条语句是以checked还是unchecked模式执行的,是在编译时检测到的,而不是在运行时检测到的。如果您的程序流离开包含函数方法调用的检查块,则 checked/unchecked 状态特定于函数本身。

可以从已检查和未检查的代码中调用 Mul 方法 - 像这样:

checked
{
     int a = 123456;
     int b = 123456;
     Console.WriteLine(Mul(a, b));
}
unchecked
{
     int a = 123456;
     int b = 123456;
     Console.WriteLine(Mul(a, b));
}

异常行为应该如何实现?是否抛出异常?

所以你必须在 Mul 方法中具体化,并在那里创建一个检查块。

public int Mul(int a, int b)
{
   checked {
       return a * b;
   }
}