什么是匿名型具体型?

时间:2011-07-13 10:47:03

标签: .net anonymous-types

我最近在StackOverflow上浏览this question,并查看接受的答案我想知道实际的具体类型是什么

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

这对MSILed有什么影响?

3 个答案:

答案 0 :(得分: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)

类型是

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

或类似的东西。 您可以像这样轻松找到它:

Console.WriteLine(ordinals.GetType());

答案 2 :(得分:1)

这将是一个名为<>f_AnnonymousType0 3`的类 - 取决于各种参数。 See also