泛型方法,使用where T:base.为什么在调用其他方法时,T不被认为是具体类型的
本文关键字:认为是 类型 方法 调用 where 使用 base 为什么 泛型方法 其他 | 更新日期: 2023-09-27 18:10:34
我想知道这里缺少什么。调试时,我将e视为SpecificException的实例,但方法调用与具有基Exception的签名匹配。为什么?如果不在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
或从其派生的类型。
它不知道具体的类型,所以唯一正确的重载是Exception
。
为了能够实现您的目标,您可以通过dynamic
关键字使用DLR:
errorMsg += Details((dynamic)e);
这将把过载分辨率移动到运行时,在这个时间点上,e
的实际类型是已知的,因此它可以选择与之最匹配的过载。