帮助说明了这一点:
匿名类型是直接从object派生的类类型 不能转换为除object之外的任何类型。编译器提供了一个 虽然您的应用程序无法访问,但每个匿名类型的名称 它。从公共语言运行时的角度来看,一个匿名的 type与任何其他引用类型没有区别。
如果程序集中的两个或多个匿名对象初始值设定项指定了 具有相同顺序且具有相同顺序的属性序列 相同的名称和类型,编译器将对象视为实例 相同的类型。它们共享相同的编译器生成类型 信息。
因为匿名类型上的Equals和GetHashCode方法是 根据Equals和GetHashCode方法定义 属性,同一匿名类型的两个实例仅在相等时才相等 他们所有的财产都是平等的。
这些都是事实,但如何?参考源明确显示了如何比较对象(ReferenceEquals
)和“直接从对象派生”的类型不能具有此特殊行为。它与Equals
中ValueType
的行为也不匹配。
那怎么办?如果没有任何可见的覆盖,匿名类型如何覆盖Equals()
和GetHashCode()
?
答案 0 :(得分:7)
编译器会为您生成GetHashCode()
和Equals()
覆盖。例如,从以下代码:
class Program
{
static void Main(string[] args)
{
var a = new { Text = "foo", Value = 17 };
Console.WriteLine(a);
}
}
您可以在已编译的.exe中找到生成的匿名类型,其中方法如下所示(这是dotPeek的输出......还有ToString()
):
[DebuggerHidden]
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("{ Text = ");
stringBuilder.Append((object) this.\u003CText\u003Ei__Field);
stringBuilder.Append(", Value = ");
stringBuilder.Append((object) this.\u003CValue\u003Ei__Field);
stringBuilder.Append(" }");
return ((object) stringBuilder).ToString();
}
[DebuggerHidden]
public override bool Equals(object value)
{
var fAnonymousType0 = value as \u003C\u003Ef__AnonymousType0<\u003CText\u003Ej__TPar, \u003CValue\u003Ej__TPar>;
return fAnonymousType0 != null && EqualityComparer<\u003CText\u003Ej__TPar>.Default.Equals(this.\u003CText\u003Ei__Field, fAnonymousType0.\u003CText\u003Ei__Field) && EqualityComparer<\u003CValue\u003Ej__TPar>.Default.Equals(this.\u003CValue\u003Ei__Field, fAnonymousType0.\u003CValue\u003Ei__Field);
}
[DebuggerHidden]
public override int GetHashCode()
{
return -1521134295 * (-1521134295 * 512982588 + EqualityComparer<\u003CText\u003Ej__TPar>.Default.GetHashCode(this.\u003CText\u003Ei__Field)) + EqualityComparer<\u003CValue\u003Ej__TPar>.Default.GetHashCode(this.\u003CValue\u003Ei__Field);
}
相关阅读:
How does ToString on an anonymous type work?
Why anonymous types Equals implementation compares fields?
Equality for anonymous types
Why is ValueType.GetHashCode() implemented like it is?
这些都没有直接解决您的问题,但它们确实提供了对这些替代的具体实现的一些相关见解。