在C#中调用通用方法

8

考虑以下代码:

static void Main(string[] args)
{
   Get<Student>(new Student());
    System.Console.Read();
}

public static void Get<T>(T person)
{
    Console.WriteLine("Generic function");
}
public static void Get(Person person)
{
    person.Show();
}

这是我的人员类:

class Person
{
    public void Show()
    {
        Console.WriteLine("I am person");
    }
}
class Student : Person
{
    public new void Show()
    {
        Console.WriteLine("I am Student");
    }
}

我调用Get方法并将学生对象传递给该方法。代码如下:

 Get<Student>(new Student());

所以我得到了这个: 通用函数。但当我像这样调用Get时:
 Get(new Student());

我希望这个Get(Person person)会被调用,但是会再次调用:Get<T>(T person)。为什么编译器会有这种行为?


5
这里,问题基本上是相同的。 - Save
5
重载优先级的确切规则很复杂,并且在规范中有说明:但我怀疑它实际上是调用了Get<Student>(Student)-这是一个精确匹配;Get(Person)不是精确匹配,因为你传递的是一个学生,而不是一个人。 - Marc Gravell
1个回答

12
我可以为您推荐Jon Skeet的书《C#深度剖析》(目前是第二版),第9.4.4章节。我修改了文本以适应您的情况。

选择正确的重载方法

此时,编译器会考虑从Student到Student和从Student到Person的转换。将任何类型转换为自身被定义为比转换为不同类型更好,因此在这种特定调用中,T为Student的Get(T x)方法优于Get(Person y)。

该书中有稍微更详细的解释,我强烈建议您仔细阅读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接