繁体   English   中英

重写Object.Equals并实现IEquatable <>时无法访问的代码?

[英]Unreachable code when overriding Object.Equals and implementing IEquatable<>?

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

MSDN上的IEquatable文档指出:

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

我的问题是:

  1. 是正确的,永远不会使用Entry类型的实例调用下面的Equals(object obj)方法吗?
  2. 那么在下面的Equals(object obj)方法中return false是否就足够了?
  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();
    }
}

在此先感谢您的帮助!

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

不,请考虑:

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

entry2的编译时类型是object ,而不是Entry ,因此仍将调用Equals(object)

(顺便说一下,请注意,您的GetHashCode实现绝对是狡猾的,并且您目前无法在任何地方防止null。我们不知道Entry是类还是结构也无济于事。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM