为什么不能在数组中交换匿名类型的属性?

meJ*_*rew 4 .net c# arrays anonymous-types

我知道在C#中我可以声明一个匿名类型数组,如下所示:

var anons = new[]
{
    new { name = "" , something = ""},
    new { name = "", something = "" }
};
Run Code Online (Sandbox Code Playgroud)

我可以理解,所有对象都必须具有相同的属性,否则一个对象将无法遍历它们并使用如下属性:

foreach (var anon in anons)
{
    Console.WriteLine(anon.name);
}
Run Code Online (Sandbox Code Playgroud)

但是我不明白的是为什么它们的属性需要具有相同的顺序?

例如,以下代码将无法编译:

var anons = new[]
{
    new { name = "" , something = ""},
    new { something = "", name = "" }
};
Run Code Online (Sandbox Code Playgroud)

为什么不允许这样做,因为在普通对象中,无论属性的顺序如何都可以声明属性,而其余代码可以使用它们,就像现在一样?

Sco*_*nen 7

从匿名类型的文档中:https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types

如果程序集中的两个或多个匿名对象初始化程序指定了具有相同顺序,名称和类型相同的属性序列,则编译器会将这些对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。

换句话说,您正在创建两个匿名类型,并且属性名称和属性类型的顺序不匹配。它们对我们来说看起来几乎一样,但是编译器将它们视为两种不同的类型,这意味着它无法为数组声明推断一种类型。