【发布时间】:2012-08-25 16:02:55
【问题描述】:
我只是想知道为什么该语言的设计者决定在匿名类型上实现 Equals,类似于在值类型上实现 Equals。这不是误导吗?
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void ProofThatAnonymousTypesEqualsComparesBackingFields()
{
var personOne = new { Name = "Paweł", Age = 18 };
var personTwo = new { Name = "Paweł", Age = 18 };
Console.WriteLine(personOne == personTwo); // false
Console.WriteLine(personOne.Equals(personTwo)); // true
Console.WriteLine(Object.ReferenceEquals(personOne, personTwo)); // false
var personaOne = new Person { Name = "Paweł", Age = 11 };
var personaTwo = new Person { Name = "Paweł", Age = 11 };
Console.WriteLine(personaOne == personaTwo); // false
Console.WriteLine(personaOne.Equals(personaTwo)); // false
Console.WriteLine(Object.ReferenceEquals(personaOne, personaTwo)); // false
}
乍一看,所有打印的布尔值都应该是假的。但是当使用Person 类型和匿名类型时,带有Equals 调用的行返回不同的值。
【问题讨论】:
-
这是 SO 上为数不多的有 3 个或更多答案的帖子之一。截至 2017 年 5 月 23 日,回答的人已超过 95k。