c# - EqualityComparer<T>.Default 误解?

标签 c# .net-4.0 iequalitycomparer

我有一个类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) . 它的优点是避免装箱

enter image description here 但是

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>.Defaultgeneric 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/

相关文章:

c# - 在发送传出请求之前将新的 SoapClient 绑定(bind)到特定的 IP 地址

c# - 使用 Windows Azure 服务总线扩展 SignalR

entity-framework - 确保 DateTime 属性返回 DateTimeKind.Utc

c# - 我应该如何实现 IEqualityComparer<T>.Equals

c# - 如何在 C# 中为桌面应用程序创建 activeX 组件

c# - Unity C# 脚本中未调用重写虚函数

c# - .NET 中的时区问题

.net - 从安装程序类停止 Windows 服务时出现问题。事件触发得太晚

c# - 如何使用 IEqualityComparer

c# - 使用基类 IEqualityComparer 执行 Distinct(),并且仍然返回子类类型?