通过


CA1067:实现 IEquatable 时重写 Equals

属性
规则 ID CA1067
标题 实现 IEquatable 时重写 Equals
类别 设计
修复会引起中断还是不会引起中断 非中断
在 .NET 10 中默认启用 作为一种建议
适用的语言 C# 和 Visual Basic

原因

类型实现了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();
}

何时禁止显示警告

请勿抑制对此规则的违反行为。

另请参阅