汎用型の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()というメソッドを持つようです。
利用側は、
Cc = new C ();
は newobj instance void class 'C`2'
こうなると、Generic Typeを使うクラスは完全に別物にしなくてはいけませんね。JavaみたくClassとClass
そうなるとSystem以下のコアクラスはGeneric Typeの恩恵を受けないのか、それとも一新して過去の互換をなくすのか気になります。現状は一部別名前空間にして別実装を置いてるけど、それはそれでGeneric Typeを使った実装と使ってない実装のあいだのやり取りはどうするのだろうか、とても疑問なのですが。