3

我想知道我在这里缺少什么。调试时,我将 e 视为 SpecificException 的实例,但方法调用与带有基本异常的签名匹配。怎么来的?我可以在不检查我的 LogException 方法中的类型的情况下解决这个问题吗?

public string LogException<T>(T e)
        where T : Exception
{
    string errorMsg = e.ToString();
    errorMsg += Details(e);
    return errorMsg;
}

public string Details(Exception exception)
{
     return "foo";
}

public string Details(SpecificException exception)
{
     return "bar";
}
4

1 回答 1

8

重载解决发生在编译时在编译时,编译e器不可能知道. 它只知道那e将是类型Exception或派生自它的类型。
它不知道具体类型,所以唯一正确使用的重载是 for Exception

为了能够实现您的目标,您可以通过dynamic关键字使用 DLR:

errorMsg += Details((dynamic)e);

这会将重载决议移动到运行时,并且在那个时间点,实际类型e是已知的,因此它可以选择最匹配它的重载。

于 2013-04-23T13:17:02.817 回答