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

C# 重写Object.Equals并实现IEquatable时无法访问的代码<>;?,c#,equality,iequatable,unreachable-code,C#,Equality,Iequatable,Unreachable Code,我现在有点困惑。据我所知,.NET运行时将选择最适合给定参数类型的重载方法。因此我认为,在下面的代码片段中,方法Equals(objectobj)永远不会用类型为Entry的实例调用。相反,由于存在具有正确参数类型的方法Equals(Entry other),因此将调用该方法 国家 如果实现IEquatable,还应该重写Object.Equals(Object)和GetHashCode的基类实现,以便它们的行为与IEquatable.Equals方法的行为一致。如果确实重写了Object.Eq

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

国家

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

我的问题是:

  • 下面的
    Equals(objectobj)
    方法永远不会用类型为
    Entry
    的实例调用,这是否正确
  • 那么在下面的
    Equals(objectobj)
    方法中只返回false就足够了吗
  • 如果是这样,为什么编译器不认为下面的注释行是不可访问的
  • 我所指的代码:

    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();
        }
    }
    
    密封类条目:IEquatable{
    ...
    //覆盖对象。等于
    公共覆盖布尔等于(对象对象对象)
    {
    如果(obj是条目)
    {
    返回this.Equals(obj作为条目);//是否可以访问此代码?
    }
    返回false;
    }
    //实现IEquatable.Equals
    公共布尔等于(其他条目)
    {
    返回this.Hash.Equals(other.Hash)
    &&this.Path.Equals(other.Path)
    &&此.Order.Equals(其他.Order);
    }
    公共覆盖int GetHashCode()
    {
    返回base.GetHashCode();
    }
    }
    
    提前谢谢你帮助我

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

    不,请考虑:

    object entry1 = new Entry(...);
    object entry2 = new Entry(...);
    bool equal = entry1.Equals(entry2);
    
    entry2
    的编译时类型是
    object
    ,而不是
    Entry
    ,因此它仍将调用
    Equals(object)

    (顺便说一句,请注意您的
    GetHashCode
    实现绝对是不可靠的,而且您目前在任何地方都没有防范空值。我们不知道
    Entry
    是类还是结构都没有帮助。)

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

    不,请考虑:

    object entry1 = new Entry(...);
    object entry2 = new Entry(...);
    bool equal = entry1.Equals(entry2);
    
    entry2
    的编译时类型是
    object
    ,而不是
    Entry
    ,因此它仍将调用
    Equals(object)


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

    非常感谢@Jon Skeet!这消除了我的困惑。也谢谢你的旁注-我会相应地修改我的代码。顺便说一句:这是一个非常快速的回答!好了,谢谢你@Jon Skeet!这消除了我的困惑。也谢谢你的旁注-我会相应地修改我的代码。顺便说一句:这是一个非常快速的回答!