C# Equals()可满足它们之间的关系如何?

C# Equals()可满足它们之间的关系如何?,c#,equals,C#,Equals,可能重复: 我知道C#中的所有类都是从object派生出来的,object有一个名为Equals()的虚拟方法 为什么我要实现IEquatable?为什么不重写对象.Equals?IEquatable定义 bool Equals(T other) 而对象的等号定义 bool Equals(object other) 因此,为类定义IEquatable可以让您更轻松地比较同一类的两个项,而不必强制转换为当前类型。很多时候,您会看到人们实现IEquatable,然后重写对象的Equals来调用

可能重复:

我知道C#中的所有类都是从object派生出来的,object有一个名为
Equals()
的虚拟方法

为什么我要实现
IEquatable
?为什么不重写
对象.Equals

IEquatable
定义

bool Equals(T other)
而对象的等号定义

bool Equals(object other)
因此,为类定义IEquatable可以让您更轻松地比较同一类的两个项,而不必强制转换为当前类型。很多时候,您会看到人们实现IEquatable,然后重写对象的Equals来调用IEquatable的Equals:

public class SomeClass : IEquatable<SomeClass>
{
    public bool Equals(SomeClass other)
    {
        // actual compare
    }

    public override bool Equals(object other)
    {
        // cross-call to IEquatable's equals.
        return Equals(other as SomeClass); 
    }
}
public类SomeClass:IEquatable
{
公共布尔等于(某类其他)
{
//实际比较
}
公共覆盖布尔等于(对象其他)
{
//对等式的交叉调用。
返回等于(其他为SomeClass);
}
}
此外,还可以定义其他类型之间的相等性。类似于使分数实现IEquatable

IEquatable
定义

bool Equals(T other)
而对象的等号定义

bool Equals(object other)
因此,为类定义IEquatable可以让您更轻松地比较同一类的两个项,而不必强制转换为当前类型。很多时候,您会看到人们实现IEquatable,然后重写对象的Equals来调用IEquatable的Equals:

public class SomeClass : IEquatable<SomeClass>
{
    public bool Equals(SomeClass other)
    {
        // actual compare
    }

    public override bool Equals(object other)
    {
        // cross-call to IEquatable's equals.
        return Equals(other as SomeClass); 
    }
}
public类SomeClass:IEquatable
{
公共布尔等于(某类其他)
{
//实际比较
}
公共覆盖布尔等于(对象其他)
{
//对等式的交叉调用。
返回等于(其他为SomeClass);
}
}

此外,还可以定义其他类型之间的相等性。就像让分数工具变得可计算一样。@安德鲁:哈,另一只兔子?想知道我们是否在我们祖先的任何地方有亲戚关系…很酷!我的中间名也是迈克尔-小世界:)将IEquatable应用到结构上是一个巨大的胜利,因为它可以让它们在没有拳击的情况下进行比较。将IEquatable应用于密封的不可变引用类型是一个小胜利,因为它消除了类型检查和/或类型转换的需要。将其应用于未密封的类型是危险的,因为重写Object.Equals而不重写IEquatable的派生类型将向不同的使用者公开不同的相等性测试方法。如果IEquatable包含了自己的GetHashCode,这可能不是一件可怕的事情,但事实并非如此。而且你们两人之间的距离正好是100k:)@Andrew:Hah,另一只兔子?想知道我们是否在我们祖先的任何地方有亲戚关系…很酷!我的中间名也是迈克尔-小世界:)将IEquatable应用到结构上是一个巨大的胜利,因为它可以让它们在没有拳击的情况下进行比较。将IEquatable应用于密封的不可变引用类型是一个小胜利,因为它消除了类型检查和/或类型转换的需要。将其应用于未密封的类型是危险的,因为重写Object.Equals而不重写IEquatable的派生类型将向不同的使用者公开不同的相等性测试方法。如果IEquatable包含自己的GetHashCode,这可能不是一件可怕的事情,但事实并非如此