繁体   English   中英

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

[英]In generic method, why the generic overload is preferred to an implemented method with parent type?

假设我创建了一个通用方法,并实现了一些类型,如下面的代码所示。 我还有两个对象,一个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

代码与问题不符。 首先, object不是int的父级。 值类型必须装箱才能转换为object 即使使用引用类型,假设A是B的父级, List<A> 也不List<B>的父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)更合适

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM