我知道在C#中我可以声明一个匿名类型数组,如下所示:
var anons = new[]
{
new { name = "" , something = ""},
new { name = "", something = "" }
};
我可以理解所有对象都需要具有相同的属性,否则将无法遍历它们并使用以下属性:
foreach (var anon in anons)
{
Console.WriteLine(anon.name);
}
但我不明白为什么他们的房产需要有相同的订单?
例如,以下代码将无法编译:
var anons = new[]
{
new { name = "" , something = ""},
new { something = "", name = "" }
};
为什么不允许这样做,因为在普通对象中,无论顺序如何都可以声明属性,其余代码可以使用它们,就像现在一样?
从匿名类型的文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types
如果程序集中的两个或多个匿名对象初始值设定项指定了具有相同顺序且具有相同名称和类型的属性序列,则编译器会将对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。
换句话说,您正在创建两个匿名类型,并且属性名称和属性类型的序列不匹配。它们对我们看起来几乎相同,但编译器将它们视为两种不同的类型,这意味着它无法推断出数组声明的一种类型。
尽管斯科特给出的答案几乎是正确的,但它并没有完全回答原因。由于这是关于匿名类型数组的编译器设计的更多问题,并且我们大多数人都无法得出明确的答案,我将保持问题公开并推迟接受答案,直到有人回答原因问题为止。同时我将留下以下理论:
对于这个问题
为什么他们的房产需要有相同的订单?
为什么不?
因为现在可以声明一个匿名类型的数组,有可能交换对象中属性的顺序对任何人都没有帮助。
与此相反,在匿名类型的数组的对象内改变匿名对象的属性的顺序可能会产生误导,并且为了保持一致性应该避免。在这种情况下,应该为正在尝试交换对象属性的程序员显示警告或至少一条消息,以便为什么不从头开始使其成为错误,并且无需使C#编译器变得智能足以理清属性本身。
总之:使属性始终处于相同的顺序不是缺少功能,而是功能。