C# 当null被传递到泛型方法时,奇怪的是我仍然可以得到类型
我在玩一些泛型,我偶然发现了一些非常有趣的东西。请查看这一行的代码Console.WriteLinetestClass1.ContainesTestClass;它产生输出:true。我不知道为什么,因为类被赋值为null,当我进入代码时,我可以看到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
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,您将看到完全不同的行为。