c# - 当类型是隐式时,何时以及如何确定受约束泛型类型的类型?

标签 c# generics inheritance implicit-conversion

使用泛型时,何时以及如何确定对象的类型,特别是当泛型类型约束为类并且泛型类型是隐式的时?

为了澄清,给出以下代码:

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/

相关文章:

c# - 分配给事件时隐式委托(delegate)分配?

c# - 首先批量重命名 Entity Framework 数据库中的类

c# - 如何逐渐旋转一个物体以面对另一个转动最短距离

java - 如何将 List<?> 转换为 List<className>

java - java开源框架中编辑一个类的最佳方式

java - 如何强制接口(interface)出现在所有继承级别上

c# - 如何在 LINQ Join 中使用 AND 运算符

java - 参数化 Java 类以获取任意多个接口(interface)

java - 什么是原始类型,为什么我们不应该使用它呢?

Python类从父级运行方法,但保留变量