泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同。
对于每个用作参数的唯一值类型,都会创建一次专用泛型类型。
例如,假设您的程序代码声明了一个由整数构造的堆栈:
Stack<int> stack;
Stack<int> 代码的单个实例:
Stack<int> stackOne = new Stack<int>(); Stack<int> stackTwo = new Stack<int>();
由于每个专用泛型类本身就包含值类型,因此不再需要转换。
之所以可以这样,是因为所有引用的大小相同。
Customer 类型的堆栈:
class Customer { } class Order { }
Stack<Customer> customers;
Order:
Stack<Order> orders = new Stack<Order>();
Customer 类型堆栈的代码:
customers = new Stack<Customer>();
因为引用类型的数量会随程序的不同而大幅变化,C# 泛型实现将编译器为引用类型的泛型类创建的专用类的数量减小到一个,从而大幅减小代码量。
此外,使用值类型或引用类型参数实例化泛型 C# 类时,反射可以在运行时查询它,并且可以确定它的实际类型及其类型参数。