泛型方法,使用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";
}

泛型方法,使用where T:base.为什么在调用其他方法时,T不被认为是具体类型的

重载解析发生在编译时。在编译时,编译器不可能知道e运行时类型。它只知道e将是类型Exception或从其派生的类型。
它不知道具体的类型,所以唯一正确的重载是Exception

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

errorMsg += Details((dynamic)e);

这将把过载分辨率移动到运行时,在这个时间点上,e的实际类型是已知的,因此它可以选择与之最匹配的过载。

相关文章: