在c#中调用泛型方法

Moh*_*ani 8 c#

考虑以下代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

这是我的人类:

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

我打电话Get给学生并通过该方法.就像这样:

 Get<Student>(new Student());
Run Code Online (Sandbox Code Playgroud)

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

 Get(new Student());
Run Code Online (Sandbox Code Playgroud)

我希望这Get(Person person)可以被调用Get<T>(T person).但是再次打电话:.为什么编译器有这种行为?

Ond*_*cek 12

我可以推荐Jon Skeet的书C#in Depth(现在的第二版),第9.4.4章.我改变了文字以适应你的情况.

选择正确的重载方法

此时,编译器会考虑从Student转换为Student,从Student转换为Person.从任何类型到自身的转换被定义为优于任何到不同类型的转换,因此对于此特定调用,使用T作为Student方法的Get(T x)优于Get(Person y).

书中有更多的解释,我至少强烈建议你仔细阅读.