1

我现在有点困惑。据我了解,.NET 运行时将选择最适合给定参数类型的重载方法。所以我认为,在下面的代码片段中,Equals(object obj)永远不会使用 type 的实例调用该方法Entry。相反 - 因为存在Equals(Entry other)具有正确参数类型的方法 - 它将被调用。

MSDN 上文档IEquatable指出

如果您实现 IEquatable,您还应该重写 Object.Equals(Object) 和 GetHashCode 的基类实现,以便它们的行为与 IEquatable.Equals 方法的行为一致。如果您确实重写了 Object.Equals(Object),那么在调用类上的静态 Equals(System.Object, System.Object) 方法时也会调用您重写的实现。

我的问题是:

  1. 是否正确,Equals(object obj)永远不会使用 type 的实例调用下面的方法Entry
  2. return false那么仅仅在Equals(object obj)下面的方法中就足够了吗?
  3. 如果是这样,为什么编译器不将下面的注释行识别为无法访问?

我参考的代码:

sealed class Entry : IEquatable<Entry> {
    ...
    // Overrides Object.Equals
    public override bool Equals(object obj)
    {
        if (obj is Entry)
        {
            return this.Equals(obj as Entry); // Is this code reachable?
        }
        return false;
    }

    // Implements IEquatable<Entry>.Equals
    public bool Equals(Entry other)
    {
        return this.Hash.Equals(other.Hash)
            && this.Path.Equals(other.Path)
            && this.Order.Equals(other.Order);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

提前感谢您帮助我!

4

1 回答 1

4

永远不会使用 Entry 类型的实例调用下面的 Equals(object obj) 方法是否正确?

不。考虑:

object entry1 = new Entry(...);
object entry2 = new Entry(...);
bool equal = entry1.Equals(entry2);

的编译时类型entry2object,不是Entry,所以这仍然会调用Equals(object)

(请注意,顺便说一句,您的GetHashCode实现绝对是狡猾的 - 而且您目前没有在任何地方防范空值。我们不知道Entry是类还是结构也无济于事。)

于 2015-06-30T12:26:54.207 回答