13

我考虑了2个案例:

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,那么为什么编译器会在第一种情况下重用单个类,而不仅仅是为每个匿名类型声明生成一个新类?

4

3 回答 3

7

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

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

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

于 2013-05-31T14:26:39.480 回答
7

所以设计决定的原因是ToString。匿名类型string对订单返回不同的编码。阅读Eric Lippert 的博客

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

演示

于 2013-05-31T14:31:08.960 回答
4

你导致我猜的原因是:类型是匿名的,所以依赖于 GetType()返回可靠的结果是一个糟糕的主意。

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

于 2013-05-31T14:27:43.283 回答