代码之家  ›  专栏  ›  技术社区  ›  RameshVel

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

  •  8
  • RameshVel  · 技术社区  · 16 年前

    我得到了一个从匿名类型创建匿名列表的场景,我使用

        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 });
        }
    

    这些是错误消息

    有一些无效的参数

    论点 “匿名类型#2”改为“匿名类型#1”

    这背后的原因是什么??

    3 回复  |  直到 16 年前
        1
  •  10
  •   Jon Skeet    16 年前

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

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

    在同一个程序中,两个匿名 指定 相同属性的属性序列 中的名称和编译时类型 相同的顺序将生成 相同的匿名类型。

        2
  •  5
  •   Eric Lippert    16 年前

    我个人不能想出一个,但也许你能。

        3
  •  3
  •   Brian Rasmussen    16 年前

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

    根据语言规范:

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