【问题标题】:Unreachable code when overriding Object.Equals and implementing IEquatable<>?覆盖 Object.Equals 并实现 IEquatable<> 时代码无法访问?
【发布时间】:2015-06-30 12:25:16
【问题描述】:

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

documentation for IEquatable on MSDN 声明

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

我的问题是:

  1. 下面的Equals(object obj) 方法永远不会被Entry 类型的实例调用,对吗?
  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();
    }
}

提前感谢您帮助我!

【问题讨论】:

    标签: c# equality iequatable unreachable-code


    【解决方案1】:

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

    没有。考虑:

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

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

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

    【讨论】:

    • 谢谢@Jon Skeet!这消除了我的困惑。还要感谢您的旁注 - 我会相应地更改我的代码。顺便说一句:这是一个非常快的答案!
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2013-07-21
    • 2014-04-20
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多