我正在玩一些仿制药,我偶然发现了一些非常有趣的东西。请看一下此行代码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 ;; ?
答案 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}}参数。