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的那个?
答
在以下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
被声明为静态。因此任何绑定到函数都是在编译时。
你的问题不清楚。请添加更多描述 –
Idk此处不清楚:o – sTrenat