使用泛型时,何时以及如何确定对象的类型,特别是当泛型类型约束为类并且泛型类型是隐式的时?
为了澄清,给出以下代码:
public class MyClass {}
public class MyClassA : MyClass {}
public static string GetMyClassTypeByGenericType<T>(T myClass)
where T: MyClass
{
return typeof(T).Name;
}
public static string GetMyClassTypeByObjectType<T>(T myClass)
where T: MyClass
{
return myClass.GetType().Name;
}
MyClassA myA = new MyClassA ();
GetMyClassTypeByGenericType(myA); // Result: "MyClassA"
GetMyClassTypeByObjectType(myA); // Result: "MyClassA"
MyClass myClass = myA;
GetMyClassTypeByGenericType(myClass); // Result: "MyClass"
GetMyClassTypeByObjectType(myClass); // Result: "MyClassA"
为什么打电话GetMyClassTypeByGenericType(myClass)
返回基类的名称,而不是派生类的名称?我猜调用解析为 GetMyClassTypeByGenericType<MyClass>(myClass)
隐式基于变量 myClass
的声明类型,不是实际类型。
基本上,我只是想知道关于如何确定类型的泛型的幕后情况。
这是代码的 fiddle :https://dotnetfiddle.net/pCj08M
最佳答案
泛型类型解析全部都是在编译时进行的(这就是为什么你不能在没有反射的情况下将 Type
变量填充到泛型类型参数中,这并不是我们真正讨论的内容)。
因此,当给定一个变量类型 MyClassA
时,它就会使用它。对于 MyClass
也是如此,即使实际对象是派生类型。例如,如果您将其保存在 object
引用中,则第一次调用将打印 System.Object
。
另一方面,GetType
是运行时,因此无论保存该对象的变量是什么类型,它都会获取该对象的实际类型。
关于c# - 当类型是隐式时,何时以及如何确定受约束泛型类型的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661896/