【问题标题】:In generic method, why the generic overload is preferred to an implemented method with parent type?在泛型方法中,为什么泛型重载优于具有父类型的已实现方法?
【发布时间】:2025-11-23 14:25:01
【问题描述】:

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

【问题讨论】:

  • 因为泛型方法创建了一个exact类型的新方法,所以它比父类型的方法更匹配
  • 为什么会点击List&lt;object&gt;List&lt;object&gt;List&lt;int&gt; 不兼容。试试List&lt;object&gt; a = new List&lt;int&gt;(); 看看我的意思。
  • 确实,使用intobject 是一个不好的例子。 object 不是 int 的父类型。即使是,List&lt;object&gt; 也不是List&lt;int&gt; 的父类型,它完全是一个不同的类型
  • 实际演示该问题的示例是接受类型 A 和 B 的两个方法,其中 B 继承自 A:Test&lt;T&gt;(T generic)Test(A a)。即使这样,也会选择泛型方法,因为它与类型完全匹配。
  • 谢谢大家,为误导性代码道歉 - 我修改了它以匹配问题

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


【解决方案1】:

代码与问题不匹配。首先,object 不是int 的父级。值类型必须装箱才能转换为object。即使使用引用类型,假设 A 是 B 的父级,List&lt;A&gt; 不是 List&lt;B&gt; 的父级。 List&lt;A&gt; 创建一个与List&lt;B&gt; 没有继承关系的新类型。

实际演示该问题的示例是:

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) 更合适

【讨论】: