在 c# 中调用泛型方法

本文关键字:泛型方法 调用 | 更新日期: 2023-09-27 18:32:28

请考虑以下代码:

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) 。为什么编译器有这种行为?

在 c# 中调用泛型方法

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

选择正确的重载方法

此时,编译器会考虑从学生到 学生,以及从学生到个人。从任何类型到 本身被定义为比任何转换为不同的 类型,因此 Get(T x) 将 T 作为学生方法优于 获取(人员 y)用于此特定调用。

书中还有一点解释,我至少可以强烈建议你仔细阅读。