我有一个类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)
将运行 with or withOUT EqualityComparer<Person>.Default
(因为它实现了 IEquatable)
那么我们在谈论什么拳击?没有!
唯一一次Equals(object obj)
将在以下时间运行:
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
但是我是一名程序员!我永远不会发送 object
当它实际上是一个Person
!
我错过了什么?我无法理解 EqualityComparer<Object>.Default
的好处.有人可以给我一个例子来证明我错了吗?
最佳答案
你可以传入 IEqualityComparer<object>.Default
是 generic contravariance 的效果,在 .NET 4 中添加。
本质上,一个 IEqualityComparer<BaseType>
可以在 IEqualityComparer<DerivedType>
时使用是必需的,其中 DerivedType : BaseType
.自 Person
源自 Object
,这意味着 IEqualityComparer<Object>
可用于 IEqualityComparer<Person>
的任何地方是必需的。
关于c# - EqualityComparer<T>.Default 误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9654421/