我有一个Person类,它从IEquatable<Person>实现Equals()方法(还覆盖了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;
    }
}

好吧,让我们开始:
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 };

让我们谈谈这一行:
 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);

我在理解此部分时遇到问题:
EqualityComparer<Person>.Default

我听说EqualityComparer<Person>.Default将检查该类是否正在实现IEquatable-它将采用Equals(Person other)方法而不是Equals(object obj)它具有避免拳击的优点


Equals(Person other)将与或与OUT一起运行 EqualityComparer<Person>.Default(因为它正在实现IEquatable)

那么我们在说什么拳击呢?没有!
Equals(object obj)将仅在以下时间运行:
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);

但是我是一名程序员!当它实际上是object时,我绝不会发送Person!

我想念什么?我在理解EqualityComparer<Object>.Default的好处时遇到了麻烦。有人可以给我一个例子来证明我错了吗?

最佳答案

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

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

关于c# - EqualityComparer <T>。默认误解?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9654421/

10-10 07:19