C#选定重载方法在运行时

问题描述:

namespace Rextester 
{ 
    public class BaseException : Exception 
    { 
     public BaseException() { } 
    } 

    public class Program 
    { 
     public static void MethodA(BaseException e) 
     { 
      Console.WriteLine("BaseException"); 
     } 

     public static void MethodA(Exception e) 
     { 
      Console.WriteLine("Exception"); 
     } 

     public static void Main(string[] args) 
     { 
      try 
      { 
       throw new BaseException(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.GetType()); 
       MethodA(e); 
      } 
     } 
    } 
} 

好家伙我根据上述执行的代码的结果有一个问题:)C#选定重载方法在运行时

e.GetType(== Rextester.BaseException

治法写入到控制台:异常

因此,即使异常的类型是派生类,为什么在运行时没有调用具有参数BaseException的特定重载方法,并且被称为带Exception的那个?

+0

你的问题不清楚。请添加更多描述 –

+1

Idk此处不清楚:o – sTrenat

在以下try/catch块:

try 
{ 
    throw new BaseException(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 

抛出一个异常,并在捕获异常的类型为Exception,不BaseException。你基本上扔了一个BaseException,但BaseException继承Exception。所以你进入catch块。

如果你想赶上BaseException你应该首先理解这一点,因为它更具体。

try 
{ 
    throw new BaseException(); 
} 
catch (BaseException e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.GetType()); 
    MethodA(e); 
} 

顺便说一句,这是更清晰的名称DerivedException比名BaseException。 .NET中的所有异常类型以及自定义异常类型,我们为我们的需求定义的异常类型都继承自Exception类。所以他们都是类Exception的派生类。

上面也可以如以下发现here

例外具有以下性质:

  • 例外的是,所有最终从System.Exception派生类型。
  • 一旦try块中发生异常,控制流跳转到第一个关联的异常处理程序,该处理程序在调用堆栈中的任何地方出现 。在C#中,catch关键字用于定义 异常处理程序。

除了上面,你会发现有用的this,它指出,随着不同的异常过滤器

多个catch可以链接在一起的内容。 catch代码块在代码中从上到下进行评估,但 只有一个catch代码块针对每个引发的异常执行。 第一个catch块指定了确切的类型或基类 执行抛出的异常。如果没有catch块指定与匹配的异常过滤器匹配的 ,则选择没有过滤器 的catch块(如果语句中存在该块)。这是 具有最具体位置catch块是重要的(即,最 衍生)的异常类型第一

功能MethodA被声明为静态。因此任何绑定到函数都是在编译时。