汎用型のIL形式

C#のGeneric Typeってクラスやメソッドなどにつく属性じゃなくて、それ専用のクラス名やメソッド名を作る形式なんですね。昔出たgyroの形式を踏襲したんですね。

クラスパラメータ型は!0、!1のように、メソッドパラメータ型は!!0、!!1のようになってます。

class C {
    M1 o;
    public M2 Foo() { return null; }
}

でILでは、C'2<([mscorlib]System.Object)M1,([mscorlib]System.Object)M2>
というクラスになり、o: !0というフィールド、Foo: !1()というメソッドを持つようです。

利用側は、

C c = new C();

は newobj instance void class 'C`2'::.ctor(!0)というように、呼び出しコードでは実際の型を埋めた形にしてILに埋め込まれます。

こうなると、Generic Typeを使うクラスは完全に別物にしなくてはいけませんね。JavaみたくClassとClassの互換を取ったりすることはないようです。
そうなるとSystem以下のコアクラスはGeneric Typeの恩恵を受けないのか、それとも一新して過去の互換をなくすのか気になります。現状は一部別名前空間にして別実装を置いてるけど、それはそれでGeneric Typeを使った実装と使ってない実装のあいだのやり取りはどうするのだろうか、とても疑問なのですが。