将泛型類型或方法編譯為 Microsoft 中間語言 (MSIL) 時,它包含将其辨別為具有類型參數的中繼資料。泛型類型的 MSIL 的使用因所提供的類型參數是值類型還是引用類型而不同。
第一次用值類型作為參數來構造泛型類型時,運作庫會建立專用泛型類型,将提供的參數代入到 MSIL 中的适當位置。對于每個用作參數的唯一值類型,都會建立一次專用泛型類型。
例如,假設您的程式代碼聲明了一個由整數構造的堆棧,如下所示:
Stack<int> stack;
在此位置,運作庫生成 Stack <T> 類的專用版本,并相應地用整數替換其參數。現在,隻要程式代碼使用整數堆棧,運作庫就會重用生成的專用 Stack<T> 類。在下面的示例中,建立了整數堆棧的兩個執行個體,它們共享 Stack<int> 代碼的單個執行個體:
Stack<int> stackOne = new Stack<int>();
Stack<int> stackTwo = new Stack<int>();
但是,如果在程式代碼中的其他位置建立了另一個 Stack<T> 類,這次使用不同的值類型(如 long 或使用者定義的結構)作為其參數,則運作庫會生成泛型類型的另一版本(這次将在 MSIL 中的适當位置代入 long)。由于每個專用泛型類本身就包含值類型,是以不再需要轉換。
對于引用類型,泛型的工作方式略有不同。第一次使用任何引用類型構造泛型類型時,運作庫會建立專用泛型類型,用對象引用替換 MSIL 中的參數。然後,每次使用引用類型作為參數來執行個體化構造類型時,無論引用類型的具體類型是什麼,運作庫都會重用以前建立的泛型類型的專用版本。之是以可以這樣,是因為所有引用的大小相同。
例如,假設您有兩個引用類型:一個 Customer 類和一個 Order 類,并且進一步假設您建立了一個 Customer 類型的堆棧:
class Customer

{ }
class Order

Stack<Customer> customers;
在此情況下,運作庫生成 Stack<T> 類的一個專用版本,該版本不是存儲資料,而是存儲稍後将填寫的對象引用。假設下一行代碼建立另一個引用類型的堆棧,稱為 Order:
Stack<Order> orders = new Stack<Order>();
不同于值類型,對于 Order 類型不建立 Stack<T> 類的另一個專用版本。而是建立 Stack<T> 類的一個專用版本執行個體,并将 orders 變量設定為引用它。假設接下來您遇到一行建立 Customer 類型堆棧的代碼:
customers = new Stack<Customer>();