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

问题描述:

我有一个场景创建一个从匿名类型匿名列表,我实现了使用是匿名类型自动初始化中重要的字段顺序?

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'

背后的原因是什么?

是的,这很重要。

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

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

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

在同一节目内,两个匿名 对象初始化指定同一 名称的属性的 序列和 相同的顺序将产生的 相同匿名类型实例编译时间类型。

+0

谢谢jon澄清.. – RameshVel 2010-01-28 12:29:03

+0

我可以理解,属性的名称和数据类型需要匹配..但我不明白为什么更改设置属性的顺序需要考虑因素。任何为什么它是这样的具体原因或'他们如何选择这样做'? – Gishu 2010-01-28 12:35:44

+1

@Gishu:我认为这可能会让编译器变得更简单,所以我认为那些想要它的人可能会因为* not *问题而给出一个令人信服的理由来解释为什么它不应该这样做:) – 2010-01-28 12:51:36

是的,字段的顺序是显着的。相同的字段,不同的顺序会产生不同的类型。

从语言规范:

“在同一个程序中,两个匿名对象初始化指定同一名称的属性的序列,并以相同的顺序将产生相同的情况下,编译时类型匿名类型“。

+0

布赖恩,谢谢澄清.. – RameshVel 2010-01-28 12:29:44

背后的原因是什么?

假设顺序没有关系。假设你在编译器团队中。请为我描述在这种匿名类型上实现“ToString”的确切行为,以便实现满足所有用户的期望。

我个人不能拿出一个,但也许你可以。

+2

对匿名类型的ToString()在相同的数据上产生不同的结果,但以不同的顺序..谢谢,现在我可以将它与计算哈希值关联.. – RameshVel 2010-01-29 06:32:22