C# 当null被传递到泛型方法时,奇怪的是我仍然可以得到类型

C# 当null被传递到泛型方法时,奇怪的是我仍然可以得到类型,c#,generics,typeof,C#,Generics,Typeof,我在玩一些泛型,我偶然发现了一些非常有趣的东西。请查看这一行的代码Console.WriteLinetestClass1.ContainesTestClass;它产生输出:true。我不知道为什么,因为类被赋值为null,当我进入代码时,我可以看到null被传入 private static void Main(string[] args) { ClassWithGenericMethod testClass1 = new ClassWithGenericMeth

我在玩一些泛型,我偶然发现了一些非常有趣的东西。请查看这一行的代码Console.WriteLinetestClass1.ContainesTestClass;它产生输出:true。我不知道为什么,因为类被赋值为null,当我进入代码时,我可以看到null被传入

    private static void Main(string[] args)
    {
        ClassWithGenericMethod testClass1 = new ClassWithGenericMethod();
        TestClass testClass = null;

        Console.WriteLine(testClass1.Contains(testClass));

        Console.ReadKey();
    }

    public class ClassWithGenericMethod
    {
        public bool Contains<T>(T entity)
        {
            return typeof(T).Name == "TestClass";
        }
    }

    public class TestClass
    {
    }

那么,它如何知道返回typeofT.Name==TestClass;这一行上的正确类型呢

泛型方法的类型不会在运行时解析,而是在编译时解析。编译器知道,当您调用Contains时,您正在使用类型为TestClass的参数调用它,因此编译器使用完成的泛型方法Contains。值是否为null是一个运行时条件,它与编译器在编译代码时拥有的知识无关。

泛型方法的类型不会在运行时解析,而是在编译时解析。编译器知道,当您调用Contains时,您正在使用类型为TestClass的参数调用它,因此编译器使用完成的泛型方法Contains。值是否为null是一个运行时条件,它与编译器在编译代码时拥有的知识无关。

用外行的话说,泛型方法实际上是一种函数模板或定义,真正的方法将根据该定义构造。例如,如果调用如下方法

Contains<string>(null);

您可以看到,所有的T都被字符串替换,这使得该方法使用T类型完全合法,并且根本不需要运行时检查实体参数。

用外行的话说,泛型方法实际上是一种函数模板或定义,真正的方法将根据该定义构造。例如,如果调用如下方法

Contains<string>(null);

您可以看到,所有的T都替换为字符串,这使得该方法使用T type完全合法,并且根本不需要对实体参数进行运行时检查。

AFAIK,因为泛型在编译时解析yes-try entity.GetType,您将看到完全不同的行为。AFAIK,因为泛型在编译时解析yes-try entity.GetType,您将看到完全不同的行为。