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

Ram*_*Vel 8 c# anonymous-types

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

    public static List<T> MakeList<T>(T itemOftype)
    {
        List<T> newList = new List<T>(); 
        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 });
    }
Run Code Online (Sandbox Code Playgroud)

这些是错误消息

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

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

那背后的原因是什么?

Jon*_*eet 9

是的,这很重要.

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

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

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

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


Eri*_*ert 5

那背后的原因是什么?

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

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

  • 在匿名类型的ToString()上对相同的数据产生不同的结果,但顺序不同..谢谢,现在我可以将它与计算哈希值联系起来.. (2认同)