【发布时间】:2019-05-18 15:44:23
【问题描述】:
尽管类型约束为编译器提供了足够的信息来选择正确的重载方法签名,但执行的方法并不是我所期望的
没有泛型方法,它会像我预期的那样调用void DoSomething(IInterface obj)。使用通用方法,void DoSomething<T>(T obj) 会被调用,因为在这种情况下,出于某种原因,它被认为是更好的候选对象。
interface IInterface
{
void Method();
}
class A : IInterface
{
public void Method()
{
}
}
public class Program
{
static void Gen<T>(T obj) where T : IInterface
{
DoSomething(obj);
}
static void DoSomething<T>(T obj)
{
Console.WriteLine("IN GENERIC DO SOMETHING");
}
static void DoSomething(IInterface obj)
{
Console.WriteLine("IN INTERFACE DOSOMETHING");
}
static void DoSomething(object obj)
{
Console.WriteLine("IN OBJ DO SOMRTHING");
}
public static void Main()
{
IInterface i = new A();
Gen(i);
}
}
我希望在所有情况下都调用非泛型 DoSomething 方法,因为由于约束,编译器具有可使用的具体类型。相反,正在调用通用的 DoSomething。只有当我删除泛型版本时才会选择非泛型方法。
【问题讨论】:
-
正如代码所示,您正在调用
Gen的唯一重载。 -
不幸的是,这个问题看起来像是一个错字。我真的不是要对提出问题的人产生负面影响。但从某种意义上说,它在问为什么打电话给
Gen打电话给Gen。如果调用Gen没有调用Gen,那将是出乎意料的。
标签: c# generics overload-resolution