c# - 泛型方法,使用where T : base. 为什么调用其他方法时不认为T是具体类型?

标签 c# generics

我想知道我在这里缺少什么。调试时,我将 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/

相关文章:

c# - 在类里面对 gridview 进行排序

c# - 使用主页时在网页上设置背景图片

c# - 为什么 C# 4.0 中的类没有泛型变化?

Java泛型问号和继承

java - 填充数组的通用方法

java - 如何从参数化类型方法参数中获取参数化类型类?

c# - Linq to SQL - 在 Html.TextBoxFor 中格式化 DateTime

c# - CvInvoke.Canny() - 在不同的计算机上给出不同的结果

c# - Base64 字符串编码 C# 与 TSQL

c# - C# 中的递归泛型类型参数