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());

所以我明白了:Generic function。但是当我Get这样打电话时:

 Get(new Student());

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

4

1 回答 1

12

我可以参考 Jon Skeet 的书 C# in Depth(现在是第二版),第 9.4.4 章。我更改了文本以适应您的情况。

选择正确的重载方法

此时,编译器考虑从 Student 到 Student 以及从 Student 到 Person 的转换。从任何类型到自身的转换都被定义为比到不同类型的任何转换要好,因此对于此特定调用,将 T 作为 Student 方法的 Get(T x) 优于 Get(Person y)。

书中有一个稍微多一点的解释,我至少可以强烈建议你通读一遍。

于 2013-09-22T09:30:56.743 回答