CA1066:重写 Equals 时实现 IEquatable

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

原因

值类型(结构)重写 Equals 方法,但不实现 IEquatable<T>

规则说明

值类型重写 Equals 方法指示它可支持对类型的两个实例进行比较以确定二者的值是否相等。 请考虑实现 IEquatable<T> 接口以支持强类型相等性测试。 这可确保执行相等性检查的调用方调用强类型 System.IEquatable<T>.Equals 方法,避免对参数进行装箱,从而提高性能。 有关详细信息,请参阅此文

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

如何解决冲突

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

public struct S
{
    private readonly int _value;
    public S(int f)
    {
        _value = f;
    }

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

    public override bool Equals(object other)
        => other is S otherS && _value == otherS._value;
}
using System;

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

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

    public override bool Equals(object other)
        => other is S otherS && Equals(otherS);

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

何时禁止显示警告

如果实现接口的设计和性能优势并不重要,则可禁止显示此规则的冲突警告。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA1066
// The code that's violating the rule is on this line.
#pragma warning restore CA1066

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA1066.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅