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

时间:2019-04-22 13:53:43

标签: c# arrays .net anonymous-types

我知道在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 = "" }
};

为什么不允许这样做,因为在 normal 对象中,可以按顺序声明属性,而其余代码可以像现在一样使用它们? / p>

2 个答案:

答案 0 :(得分:7)

摘自匿名类型的文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types

  

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

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

答案 1 :(得分:-1)

即使Scott给出的答案实际上是正确的,也不能完全回答为什么问题。由于这是一个有关匿名类型数组的编译器设计的更多问题,并且我们大多数人都无法给出明确的答案,因此我将保持开放性,并推迟接受答案,直到有人回答为什么问题。同时,我将在这里留下以下理论:

问题

  

为什么它们的属性需要具有相同的顺序?

为什么不呢?

由于现在可以声明一组匿名类型,因此有可能交换对象内属性的顺序对任何人都无济于事。

与此相反,在匿名类型数组的对象内更改匿名对象的属性顺序可能会产生误导,并且应避免保持一致性。在这种情况下,应该为试图交换对象属性的程序员显示警告或至少一条消息,为什么不从一开始就将其设置为错误,并消除使C#编译器变得智能化的需要足以整理出属性本身。

结论:始终使属性具有相同的顺序并不是缺少功能,而是功能。

相关问题