在 .NET 平台的 IL 层面,C# 泛型类型是如何进行表示和处理的?请阐述其内部机制。
考察说明
考查对 C# 泛型在 CLR 中底层表示和实例化机制的理解。
回答思路
- 【回答框架 1】泛型在 IL 中表示为带有泛型参数占位符的类型定义,通过 TypeSpec 表及泛型参数引用(如 !0、!!0)表示类型的泛型形态,并记录在元数据中。
- 【回答框架 2】对于引用类型参数,CLR 会共享同一份原生代码,实现代码共享;对值类型参数,则通过 JIT 为每个不同的值类型实例化专属版本,以保持正确的内存布局。
- 【回答框架 3】泛型方法同样以泛型定义形式存在于元数据中,包含方法的泛型参数和签名,调用时通过指定类型实参完成实例化。
- 【回答框架 4】开放泛型(如 List<T>)无法直接实例化,必须通过构造类型(如 List<int>)后进行,具体化过程由 JIT 在运行时完成。
- 【关键点 1】IL 层面使用泛型占位符和元数据描述泛型定义。
- 【关键点 2】引用类型参数共享代码,值类型参数分别 JIT 实例化。
- 【关键点 3】开放泛型不能直接创建实例,需构造具体类型。
- 【易错点 1】错误认为泛型对所有类型都生成独立代码,忽略引用类型的共享机制。
- 【易错点 2】混淆泛型类型定义和构造类型在 IL 中的区别。