Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果字段的顺序不同,为什么编译器会为匿名类型生成不同的类_C#_.net_Anonymous Types - Fatal编程技术网

C# 如果字段的顺序不同,为什么编译器会为匿名类型生成不同的类

C# 如果字段的顺序不同,为什么编译器会为匿名类型生成不同的类,c#,.net,anonymous-types,C#,.net,Anonymous Types,我考虑了两个案例: var a = new { a = 5 }; var b = new { a = 6 }; Console.WriteLine(a.GetType() == b.GetType()); // True 表意文字: 以及: 表意文字: 问题是为什么字段的顺序实际上很重要 这有什么原因吗?或者仅仅是因为它是(这就是设计) 如果原因仅仅是匿名类型不应该以这种方式使用,并且您不应该求助于GetType,那么为什么编译器在第一种情况下重复使用单个类,而不只是为每个匿名类型声明生成一个

我考虑了两个案例:

var a = new { a = 5 };
var b = new { a = 6 };
Console.WriteLine(a.GetType() == b.GetType()); // True
表意文字:

以及:

表意文字:

问题是为什么字段的顺序实际上很重要

这有什么原因吗?或者仅仅是因为它是(这就是设计)

如果原因仅仅是匿名类型不应该以这种方式使用,并且您不应该求助于
GetType
,那么为什么编译器在第一种情况下重复使用单个类,而不只是为每个匿名类型声明生成一个新类?

C#语言规范,第7.6.10.6节,要求属性序列相同,才能将匿名类型视为相同:

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


在第二个示例中,第一个匿名类具有属性序列
{a,b}
,而第二个匿名类具有序列
{b,a}
。这些序列不被认为是相同的。

我猜测的原因是:类型是匿名的,因此依靠
GetType()
返回可靠的结果是一个糟糕的主意


至于为什么编译器在顺序匹配的情况下重新使用类型,我猜这只是为了节省时间和空间。考虑到顺序,在编译过程中缓存生成的类并在需要时重新使用它们要容易得多。

因此设计决策的原因是
ToString
。匿名类型根据顺序返回不同的
字符串。阅读


什么意思是“匿名类型不应该以这种方式使用”?怎么走?你到底想做什么?Eric Lippert在博客中提到了这一点:一个稍微平凡的原因是匿名类的
ToString()
方法遵循属性声明的顺序,因此显然需要单独的类来考虑这一点。相关:@user414076,问题可以主动解决,而不仅仅是被动解决。我只是很感兴趣为什么编译器是这样工作的。你会发现很多类似的问题。这也与它们有适当的ToString表示有关。这个答案只是提出了一个问题,为什么规范是这样写的。埃里克·利珀特回答。@ArturUdod我很困惑,这和你的问题有什么关系。你问为什么订单很重要,他回答。我读了你的问题,也读了他的回答,这对我来说都是有意义的。@Rawling是真的,但说这与他的问题无关并不是一个准确的说法:)他在我看来有点粗鲁。@JeremyK,如果我是,我道歉,那不是故意的。我不是以英语为母语的人,所以我的词组基本上是粗俗而直截了当的。我只是觉得他确实给出了问题的答案/我猜
GetHashCode
的实现也取决于顺序。@Rawling:是的,是的。然而,两者相互依赖。所以不同的
ToString
使用相同的hashcode或者在不同的
ToString
上使用相同的hashcode会是一个陷阱。@TimSchmelter:为什么相同的hashcode但不同的
ToString
会是一个陷阱?让
Equals
方法将不同类型的实例报告为equal将是一个陷阱,但不相等对象之间偶尔会发生哈希代码冲突是合理的。
var a = new { a = 5, b = 7 };
var b = new { b = 7, a = 6 };
Console.WriteLine(a.GetType() == b.GetType()); // False
{ a = 5, b = 7 }
{ b = 7, a = 6 }