EqualityComparer <T>.默认误解?

Roy*_*mir 5 c# .net-4.0 iequalitycomparer

我有一个类Person,它实现了从equals()方法IEquatable<Person>(也覆盖Object.Equals方法,让我们忽略的GetHashCode()方法现在)

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,让我们开始:

Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
Run Code Online (Sandbox Code Playgroud)

让我们来谈谈这一行:

 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
Run Code Online (Sandbox Code Playgroud)

理解这部分我有一个问题:

EqualityComparer<Person>.Default
Run Code Online (Sandbox Code Playgroud)

我听说EqualityComparer<Person>.Default会检查这个类是否正在实现IEquatable- 它将采用Equals(Person other)Method而不是Equals(object obj).它有避免拳击的优势

在此输入图像描述

Equals(Person other)将运行有或没有 EqualityComparer<Person>.Default (因为它实现IEquatable)

那么我们在谈论什么拳击?没有!

Equals(object obj)将运行的唯一时间 是:

bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
Run Code Online (Sandbox Code Playgroud)

我是一名程序员!我object实际上永远不会发送一个Person!

我错过了什么?我无法理解这里的好处EqualityComparer<Object>.Default.有人可以举个例子来证明我错了吗?

And*_*ker 2

如果您作为第二个参数传入null,或者根本不传入第二个参数(基本相同),SequenceEquals 的实现将调用EqualityComparer<T>.Default自身(反编译Enumerable即可看到这一点)。EqualityComparer<T>.Default这就解释了为什么无论提供与否,您都看不到差异。

因此,最后,只有当您想使用除 之外的 EqualityComparer<T>.Default相等比较器时,第二个参数才有意义。