【问题标题】:is order of field important in anonymous types automatic initialization?匿名类型自动初始化中的字段顺序是否重要?
【发布时间】:2010-01-28 12:22:15
【问题描述】:

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

实现了这一点
    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# anonymous-types


    【解决方案1】:

    是的,这很重要。

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

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

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

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

    【讨论】:

    • 我可以理解属性的名称和数据类型需要匹配..但我不明白为什么需要考虑更改属性设置的顺序。任何具体原因就是这样,还是“他们就是这样选择的”?
    • @Gishu:我认为它可能使编译器更简单,所以我认为那些希望它重要的人有责任给出一个令人信服的理由为什么它应该' t :)
    • @JonSkeet 依赖匿名类型的GetProperties 然后按照声明匿名类型的属性的顺序返回PropertyInfo[] 是否明智?我知道常规类型的GetProperties 不可靠/不记录。
    • @nawfal:不,但我怀疑你可以使用构造函数参数的顺序。
    【解决方案2】:

    这背后的原因是什么?

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

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

    【讨论】:

    • 匿名类型的 ToString() 在相​​同数据上产生不同的结果,但顺序不同.. 谢谢,现在我可以将其与计算哈希值联系起来..
    【解决方案3】:

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

    来自语言规范:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      相关资源
      最近更新 更多