【发布时间】:2015-11-23 19:18:58
【问题描述】:
我的 C# 源代码中有以下场景:
class A{}
class Dispatch<T>{}
static class DispatchExt
{
public static void D<T>(this Dispatch<T> d, int a)
{
Console.WriteLine("Generic D chosen with a = " + a.ToString());
}
public static void D(this Dispatch<A> d, int a)
{
Console.WriteLine("D<A> chosen with a = " + a.ToString());
}
}
class Program
{
static void D<T>(Dispatch<T> d, int a)
{
d.D(a);
}
static void Main(string[] args)
{
int a = 5;
var dispatch = new Dispatch<A>();
dispatch.D(a);
D(dispatch, a);
}
}
当我运行这段代码时,输出是:
"D<A> 选择了 a = 5"
“使用 a = 5 选择的通用 D”
这个结果让我很吃惊,因为在这两种情况下我都期待“D<A> 选择了 a = 5”。
我想知道在这种情况下一般的重载解决规则是什么,或者是什么导致了这个输出。此外,我想知道是否有办法在这两种情况下实现第一个输出。
【问题讨论】:
-
我相信这是因为在编译时静态方法中的
d.D(a)不知道将要使用的确切类型。 -
泛型参数类型信息不会以这种方式流经泛型方法。在您的静态
D方法中,对T一无所知,因此D扩展方法只有一个可能的候选者。据我所知,唯一的解决方法是在运行时使用dynamic进行调度,或者自己检查d。
标签: c# generics extension-methods c#-5.0