私は、参照型はすべて同じ構築クラスを使用することを読んだ:C# - 建設クラスのTypeオブジェクトは
ジェネリック医薬品は、参照型では異なるやや働きます。最初にジェネリック型を参照型で構成すると、ランタイムは、MSIL内のパラメータの代わりにオブジェクト参照を持つ特殊ジェネリック型を作成します。次に、構成タイプが参照タイプをパラメーターとしてインスタンス化されるたびに、そのタイプにかかわらず、ランタイムは以前に作成された汎用タイプの特殊バージョンを再利用します。これはすべての参照が同じサイズであるため可能です。 (Generics in the Run Time (C# Programming Guide))
ただし、異なるジェネリックパラメータを持つ同じジェネリックに基づいて構築されたオブジェクトでGetType()を呼び出すと、2つの異なる型が返されます。 AとBは両方のクラスであり、RefTypeは一般的なものである場合:
RefType<A> a = new RefType<A>();
RefType<B> b = new RefType<B>();
Console.WriteLine("a type is "+a.GetType());
Console.WriteLine("b type is "+b.GetType());
結果に:
"a type is RefType`1[A]"
"b type is RefType`1[B]"
これはCLRの場合でも、そこにさまざまな構築型の型オブジェクトの作成を扱うことを意味しています「本当の」特別なインスタンス化はありませんか? CLRによって生成されたものと生成されなかったものを直接見る方法はありますか?
*タイプ*は依然として非常に異なっています。テキストが言っていること(より明確なやり方でできていて、そこには多くの悪い書き方があります)は、これらの型を実装するために使用される実際のコードを参照型とのすべてのインスタンス化で共有できるということです。これは実装の詳細であり、通常はプログラマーにとってはほとんど問題ではありません。デバッガを接続し、これを見るにはコードをチェックする必要があります。私は、C#レベルでこれを確認する方法がないかどうかはわかりません。 –