比方说,我创建了一个通用方法,并实现了一些类型,如下面的代码所示。
我还有两个对象,一个Foo
和一个Bar
,其中Bar
继承自Foo
。
然后我为Foo
实现通用方法。
如果我使用Bar
调用该方法,为什么它没有达到该方法的Foo
重载?
我测试了下面的代码,这就是返回的代码。我对为什么会发生这种情况更感兴趣。
提出我的问题是因为我想以相同的方式处理Bet
和Bar
,所以方法的主体将是相同的。虽然,我看不到如何做到这一点,而不必复制代码或创建另一个分派给正确代码的方法。
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
答案 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)
更合适