【发布时间】:2020-01-05 13:38:51
【问题描述】:
在Generics in the Run Time (C# Programming Guide) 中据说确实如此,这让我感到惊讶。我一直认为,无论它是值类型还是引用类型,它都会为每个不同的类型参数创建一个单独的专用类型。也许是因为(如果我没记错的话)这就是我使用 C++ 时的样子。
无论如何,如果 C# 编译器将所有引用类型都视为一个专用泛型类中的指针,我无法理解它如何知道它处理的类型。例如,当List<T> 返回一个项目时,它应该知道它返回的类型,因此应该有一个专门的方法/类。它是如何工作的?它是否只为系统泛型集合或任何泛型类(包括自定义类)创建单个专用类型?
【问题讨论】:
-
你可以看看这个线程Where are generic methods stored值类型有不同的大小,所以每个值类型都有一个单独的构造泛型类。而且引用类型只有一个泛型类,因为大小相同
-
谢谢!如果我理解正确,对于每个引用类型,仍然会生成一个专门的类型(因为它可以通过反射获得),但在内部只有一个专门的类型将任何引用视为指针。所有这些技巧都发生在运行时(而不是编译时)。
-
是的,在 C# 中,泛型是在运行时评估的,而不是在编译时评估
-
您的问题的字面答案(也可以在标记的重复项中找到)是 不,编译器不会只创建一种类型来处理用作类型参数的所有不同引用类型泛型类型。 具有不同类型参数的泛型类型的每次使用都会为该参数生成不同的新具体类型。但是,对于引用类型确实,最终实现该类型的本机代码在所有类型参数之间共享。编译类型保证类型安全,
T的值都是引用,所以代码可以共享。