我知道泛型是由JIT(和其他所有东西一样)编译的,而模板则在编译代码时生成。
但问题在于,可以通过反射在运行时创建新的泛型类型。
这可能会影响已经通过语义解析器的泛型约束。
有人能解释一下这是如何处理的吗?发生了什么?
(包括代码生成和语义检查)
我知道泛型是由JIT(和其他所有东西一样)编译的,而模板则在编译代码时生成。
但问题在于,可以通过反射在运行时创建新的泛型类型。
这可能会影响已经通过语义解析器的泛型约束。
有人能解释一下这是如何处理的吗?发生了什么?
(包括代码生成和语义检查)
List<int>
。
如果没有,它将IL和元数据传递给JIT,
以及List<T>
的类型参数int。在JIT编译IL的过程中,
它还会替换类型参数。
[...]
接下来,我们为所有的类型实例化,
这些类型是值类型——例如List<int>
、List<long>
、
List<double>
、List<float>
——创建一个唯一的可执行本机代码副本。
所以List<int>
有自己的代码。
List<long>
有自己的代码。
List<float>
有自己的代码。对于所有的
引用类型,我们共享代码,
因为它们在表示上是相同的。只是指针。