我有一个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/