在泛型方法中,为什么泛型重载优先于具有父类型的已实现方法?

时间:2019-06-28 08:24:41

标签: c# overloading c#-5.0 generic-method

比方说,我创建了一个通用方法,并实现了一些类型,如下面的代码所示。 我还有两个对象,一个Foo和一个Bar,其中Bar继承自Foo

然后我为Foo实现通用方法。

如果我使用Bar调用该方法,为什么它没有达到该方法的Foo重载?

我测试了下面的代码,这就是返回的代码。我对为什么会发生这种情况更感兴趣。

提出我的问题是因为我想以相同的方式处理BetBar,所以方法的主体将是相同的。虽然,我看不到如何做到这一点,而不必复制代码或创建另一个分派给正确代码的方法。

public class Foo 
{
}

public class Bar : Foo
{
}

public class Bet : Foo
{
}

public static string Test<T>(T generic)
{
    Console.WriteLine("T - generic overload");
    return "Generic overload";
}

public static string Test(Foo foos)
{
    Console.WriteLine("Foo - Foo overload");
    return "Foo overload";
}

void Main()
{
    Bar bar = new Bar();
    Foo foo = new Foo();

    Test(bar);
    Test(foo);
}
Returns:
T - generic overload
Foo - Foo overload

1 个答案:

答案 0 :(得分:2)

代码与问题不符。首先,object不是int的父项。值类型必须装箱以转换为object。即使使用引用类型,假设A是B的父级,List<A>也不是List<B>的父级。 List<A>创建一个与List<B>没有继承关系的新类型。

一个实际演示该问题的示例为:

class A    {    }

class B:A  {    }

static string Test<T>(T generic)
{
    Console.WriteLine("T - generic overload");
    return "Generic overload";
}

static string Test(A a)
{
    Console.WriteLine("A - A overload");
    return "A overload";
}

static string Test(object o)
{
    Console.WriteLine("object - objectoverload");
    return "object overload";
}


void Main()
{
    var b =new B() ;
    var a=new A() ;

    Test(b);
    Test(a);
}

输出为:

T - generic overload
A - A overload

通用重载为B创建了一个完全匹配项,这意味着它比Test(A)更合适