C# 在选中块中调用的方法中没有溢出异常

C# 在选中块中调用的方法中没有溢出异常,c#,overflow,C#,Overflow,checked块用于确保在发生溢出时抛出异常。比如说, 下面的代码引发溢出异常,这很好 checked { int a = 123456; int b = 123456; Console.WriteLine(a * b); } 但如果我在checked块内调用一个方法,而该方法又有引发溢出异常的代码,checked块似乎不会检测到这一点。是否有可能检测到这些 checked { int a = 123456; int b = 123456; Console.WriteL

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;
}
public int Mul(int a, int b)
{
   checked {
       return a * b;
   }
}

这篇博文对这个话题做了一些解释:

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

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
方法中指定,并在那里创建一个选中的块

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

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