CA1067:实现 IEquatable 时重写 Equals

属性
规则 ID CA1067
标题 实现 IEquatable 时重写 Equals
类别 设计
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

类型实现 IEquatable<T>,但不实现 Equals

规则说明

实现 IEquatable<T> 接口的类型指示它可支持对类型的两个实例进行比较以确定二者是否相等。 还应重写 EqualsGetHashCode() 方法的基类实现,以便其行为与 System.IEquatable<T>.Equals 实现的行为一致。 请参阅此处了解详细信息。

Equals 实现应返回与 System.IEquatable<T>.Equals 实现一致的结果。

如何解决冲突

若要解决冲突,请调用 Equals 实现来重写 System.IEquatable<T>.Equals 并实现它。 例如,以下两个代码片段显示了规则冲突及其解决方法:

using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;
}
using System;

public struct S : IEquatable<S>
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

    public bool Equals(S other)
        => _value == other._value;

    public override bool Equals(object obj)
        => obj is S objS && Equals(objS);

    public override int GetHashCode()
        => _value.GetHashCode();
}

何时禁止显示警告

请勿禁止显示此规则的冲突警告。

另请参阅