当null被传递给泛型方法时,奇怪的是我仍然可以获得该类型

时间:2015-04-09 16:16:35

标签: c# generics typeof

我正在玩一些仿制药,我偶然发现了一些非常有趣的东西。请看一下此行代码Console.WriteLine(testClass1.Contains(testClass));产生输出: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
    {
    }

那么它如何知道这一行的正确类型返回typeof(T).Name ==&#34; TestClass&#34 ;; ?

2 个答案:

答案 0 :(得分:4)

泛型方法的类型在运行时未解析,它们在编译时解析。编译器知道当您调用Contains<T>时,您使用类型为TestClass的参数调用它,因此编译器使用完整的泛型方法Contains<TestClass>。值是否为null是运行时条件,与编译器编译代码时的知识无关。

答案 1 :(得分:2)

将其置于外行的术语中,泛型方法实际上是一种功能模板(或#34;定义&#34;)和&#34;真实的&#34;方法将从该定义构造。例如,如果您调用类似

的方法
Contains<string>(null);

.NET编译器将确保以下方法构造(或有些类似)

public bool Contains(string entity)
{
    return typeof(string).Name == "TestClass";
}

您可以看到所有T都替换为string,这使得该方法使用T类型完全合法,并且不需要entity的运行时检查{1}}参数。