是匿名类型自动初始化中重要的字段顺序?
我有一个场景创建一个从匿名类型匿名列表,我实现了使用是匿名类型自动初始化中重要的字段顺序?
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节。特别是:
在同一节目内,两个匿名 对象初始化指定同一 名称的属性的 序列和 相同的顺序将产生的 相同匿名类型实例编译时间类型。
是的,字段的顺序是显着的。相同的字段,不同的顺序会产生不同的类型。
从语言规范:
“在同一个程序中,两个匿名对象初始化指定同一名称的属性的序列,并以相同的顺序将产生相同的情况下,编译时类型匿名类型“。
布赖恩,谢谢澄清.. – RameshVel 2010-01-28 12:29:44
背后的原因是什么?
假设顺序没有关系。假设你在编译器团队中。请为我描述在这种匿名类型上实现“ToString”的确切行为,以便实现满足所有用户的期望。
我个人不能拿出一个,但也许你可以。
对匿名类型的ToString()在相同的数据上产生不同的结果,但以不同的顺序..谢谢,现在我可以将它与计算哈希值关联.. – RameshVel 2010-01-29 06:32:22
谢谢jon澄清.. – RameshVel 2010-01-28 12:29:03
我可以理解,属性的名称和数据类型需要匹配..但我不明白为什么更改设置属性的顺序需要考虑因素。任何为什么它是这样的具体原因或'他们如何选择这样做'? – Gishu 2010-01-28 12:35:44
@Gishu:我认为这可能会让编译器变得更简单,所以我认为那些想要它的人可能会因为* not *问题而给出一个令人信服的理由来解释为什么它不应该这样做:) – 2010-01-28 12:51:36