在匿名类型自动初始化中是重要的字段顺序?

我有一个场景来创建匿名类型的匿名列表,我实现了使用

public static List MakeList(T itemOftype) { List newList = new List(); return newList; } static void Main(string[] args) { //anonymos type var xx = new { offsetname = x.offName, RO = y.RO1 }; //anonymos list var customlist = MakeList(xx); //It throws an error because i have given the wrong order customlist.Add(new { RO = y.RO2, offsetname = x.offName }); customlist.Add(new { RO = y.RO3, offsetname = x.offName }); //but this works customlist.Add(new { offsetname = x.offName, RO = y.RO2 }); customlist.Add(new { offsetname = x.offName, RO = y.RO3 }); } 

这些是错误消息

System.Collections.Generic.List.Add(AnonymousType#1)’有一些无效的参数

参数’1’:无法从’AnonymousType#2’转换为’AnonymousType#1′

那背后的原因是什么?

是的,这很重要。

如果属性名称和类型相同,则两个匿名类型初始值设定项使用相同的自动生成类型,顺序相同。

散列时订单变得相关; 可能会使用一致的顺序生成类型来计算哈希值,但是将属性顺序包含在使类型唯一的一部分中似乎更简单。

有关详细信息,请参阅C#3规范的7.5.10.6节。 特别是:

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

那背后的原因是什么?

假设订单无关紧要。 假设您在编译团队中。 在这个匿名类型中描述“ToString”实现的确切行为,以便实现满足所有用户期望。

我个人无法想出一个,但也许你可以。

是的,字段的顺序很重要。 相同的字段,不同的顺序将产生不同的类型。

从语言规范:

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