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

时间:2010-01-28 12:22:15

标签: 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 });
    }

这些是错误消息

  

System.Collections.Generic.List.Add(AnonymousType#1)”   有一些无效的论点

     

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

背后的原因是什么?

3 个答案:

答案 0 :(得分:9)

是的,这很重要。

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

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

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

  

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

答案 1 :(得分:5)

  

背后的原因是什么?

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

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

答案 2 :(得分:3)

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

来自语言规范:

  

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