C#Equals扩展程序无法检查相等性

时间:2018-10-24 14:00:38

标签: c# reflection equality

我扩展了equals方法和哈希码,以检查两个具有布尔属性的相同对象的相等性。当我更改对象,使布尔属性之一为false而不是true时,它无法识别差异并断言它们相等;有什么想法吗?

   public override bool Equals(object value)
    {
        if (!(value is LocationPropertyOptions options))
            return false;

        return Equals(options, value);
    }

    public bool Equals(LocationPropertyOptions options)
    {
        return options.GetHashCode() == GetHashCode();
    }

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

    public override string ToString()
    {
        return $"{Identifier}{AccountEntityKey}{Address}{Comments}{Contact}" +
               $"{Coordinate}{Description}{FaxNumber}{LastOrderDate}{PhoneNumber}" +
               $"{ServiceAreaOverride}{ServiceRadiusOverride}{StandardInstructions}" +
               $"{WorldTimeZone_TimeZone}{ZoneField}{CommentsOptions}";
    }

2 个答案:

答案 0 :(得分:1)

您从options投了value,然后用Equalsoptions来调用value。这意味着您将valuevalue进行比较,它将始终为您返回true

public override bool Equals(object value)
{
    if (!(value is LocationPropertyOptions options))
       return false;    
    return Equals(options, value);
}

尝试比较thisvalue,例如

return Equals(this, value);

答案 1 :(得分:1)

这并不能真正回答您的问题。但是,在实现相等性时应考虑一些事情,以避免此类错误。

首先,您有两个完全不同的实现来表示相等。您的override bool Equals(object value)重定向到静态方法Object.Equals(object, object),该方法仅执行ReferenceEquals。另一方面,您的public bool Equals(LocationPropertyOptions)(可能是IEquatable<LocationPropertyOptions>的实现)只是使用了奇怪的GetHashCode实现,即

第二点:您不应该在哈希码实现中使用可变成员,尤其是当对象存储在字典或哈希图中时,这在很大程度上取决于哈希码的良好实现。参见MSDN on GetHashCode

  

您可以重写GetHashCode()以获取不可变的引用类型。在   通常,对于可变引用类型,您应该覆盖   仅在以下情况下获取GetHashCode():

     
      
  • 您可以从不可变的字段中计算哈希码;或

  •   
  • 您可以确保可变对象的哈希码不会更改   而对象包含在依赖于其哈希的集合中   代码。

  •   

第三个也是最后一个:您不应在检查是否相等时使用GetHashCode

  

不要测试哈希码是否相等,以确定是否两个   对象相等

尽管假定相等的对象具有相同的哈希码,但是无论如何,不​​同的对象可能具有完全相同的哈希码。相等的哈希码只是两个实例可能相等的指标

  

两个相等的对象返回相等的哈希码。然而,   反之则不成立:相等的哈希码并不意味着对象   相等,因为不同的(不相等)对象可以具有相同的哈希   代码[...]
  您不应假定相等的哈希码意味着对象相等。