2011-07-13 5 views
3

私は最近のStackOverflowの上ここthis questionを閲覧し、私はこれがにMSILedを取得しない何これはなんで匿名タイプのコンクリートタイプ?

var ordinals = new { 
         Test1 = SomeFunctionReturningInt32("Test1"), 
         Test2 = SomeFunctionReturningInt32("Test2") 
        }; 

の実際の、具体的な種類があるのだろうか受け入れ答えを見ていましたか?

+1

'var type = ordinals.GetType();'生成されたコンパイル時です。タイプはあなたに関係するべきではありません。 – leppie

答えて

8

。次のようなものがあります。

internal sealed class SomeCompilerGeneratedNameHere<T1, T2> 
{ 
    public SomeCompilerGeneratedNameHere(T1 test1, T2 test2) 
    { 
     ... 
    } 

    public T1 Test1 { get { ... } } 
    public T2 Test2 { get { ... } } 

    // Overrides for Equals, ToString, GetHashCode 
} 

あなたのケースでは、SomeCompilerGeneratedNameHere<int, int>が使用されます。 (名前自体は "言い表せない"名前なので、コード内で明示的に参照することはできず、有効なC#タイプの命名の衝突はありません)。

コンストラクタとプロパティはです。実際にはか、内部であるかどうかはわかります。型自体は内部であることがわかります。

同じ順序で同じプロパティ名を持つすべての匿名型は、異なるジェネリック型を持つ可能性があります。

これは実装固有であることに注意してください。は、汎用タイプが使用されることを保証するを保証していません。使用される匿名タイプごとに1つのタイプが存在する可能性があります。 の仕様は、2つの匿名型作成式が、同じプロパティ名と同じ順序で同じタイプのを持つ場合、同じタイプを使用することを保証します。

+0

興味深いことに、私はアセンブリをildasmで開きました( 'ildasm'はすべてのコンパイルで生成された匿名型を下に示しています)、私の場合コンパイラは単一の匿名型を生成しました(私は'名前 ' - ' Value'パラメータをメソッドに複数回渡します)。したがって、 'Single anonymous type'が生成されました - その場合、仕様が動作します。 – Kuncevic

2

タイプは

<>f__AnonymousType0`2[System.Int32,System.Int32] 

または類似のものです。 あなたは簡単にこのように自分でそれを見つけることができます:それはあなたのアセンブリ内の一般的な内部型にコンパイルさ

Console.WriteLine(ordinals.GetType()); 
1

これは、<>f_AnnonymousType0のような名前のクラスになります - さまざまなパラメータに依存します。 See also

関連する問題