我扩展了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}";
}
答案 0 :(得分:1)
您从options
投了value
,然后用Equals
和options
来调用value
。这意味着您将value
与value
进行比较,它将始终为您返回true
public override bool Equals(object value)
{
if (!(value is LocationPropertyOptions options))
return false;
return Equals(options, value);
}
尝试比较this
与value
,例如
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
:
不要测试哈希码是否相等,以确定是否两个 对象相等
尽管假定相等的对象具有相同的哈希码,但是无论如何,不同的对象可能具有完全相同的哈希码。相等的哈希码只是两个实例可能相等的指标。
两个相等的对象返回相等的哈希码。然而, 反之则不成立:相等的哈希码并不意味着对象 相等,因为不同的(不相等)对象可以具有相同的哈希 代码[...]
您不应假定相等的哈希码意味着对象相等。