我想知道我在这里缺少什么。调试时,我将 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";
}
最佳答案
重载解析发生在编译时。在编译时,编译器不可能知道e
的运行时类型。它只知道 e
将属于 Exception
类型或派生自它的类型。
它不知 Prop 体类型,因此唯一正确使用的重载是 Exception
。
为了能够实现您的目标,您可以通过 dynamic
关键字使用 DLR:
errorMsg += Details((dynamic)e);
这会将重载决议移至运行时,并且在那个时间点,e
的实际类型是已知的,因此它可以选择最匹配的重载。
关于c# - 泛型方法,使用where T : base. 为什么调用其他方法时不认为T是具体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170314/