如果字段的顺序不同,为什么编译器会为匿名类型生成不同的类

时间:2013-05-31 14:22:31

标签: c# .net anonymous-types

我考虑了两个案例:

var a = new { a = 5 };
var b = new { a = 6 };
Console.WriteLine(a.GetType() == b.GetType()); // True

Ideone:http://ideone.com/F8QwHY

var a = new { a = 5, b = 7 };
var b = new { b = 7, a = 6 };
Console.WriteLine(a.GetType() == b.GetType()); // False

Ideone:http://ideone.com/hDTcxX

问题是为什么字段顺序实际上很重要?

是否有任何理由,或仅仅因为它(例如设计)。

如果原因只是匿名类型不应该以这种方式使用而你不应该诉诸GetType,那么为什么编译器在第一种情况下重用一个类而不仅仅生成每个匿名类型声明的新类?

3 个答案:

答案 0 :(得分:7)

C#语言规范,第7.6.10.6节,要求属性序列相同,以便将匿名类型视为相同:

  

在同一个程序中,两个匿名对象初始值设定项以相同的顺序指定相同名称和编译时类型的属性序列,这将生成相同匿名类型的实例。

在第二个示例中,第一个匿名类具有属性序列{a, b},而第二个匿名类具有序列{b, a}。这些序列不被认为是相同的。

答案 1 :(得分:7)

因此,设计决策的原因是ToString。匿名类型会返回不同的string值。阅读Eric Lippert's blog

{ a = 5, b = 7 }
{ b = 7, a = 6 }

Demo

答案 2 :(得分:4)

你引导我猜测的原因是:这些类型是匿名的,所以取决于GetType()来返回可靠的结果是一个糟糕的主意。

至于为什么编译器在订单匹配时重新使用类型,我猜测它只是为了节省时间和空间。当您考虑到顺序时,在编译期间缓存生成的类会更容易,然后在需要时重新使用它们。