CA2224: переопределяйте Equals при перегрузке оператора равенства

Свойство Значение
Идентификатор правила CA2224
Заголовок Переопределение Equals при перегрузке оператора равно
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Открытый тип реализует оператор равенства, но не переопределяет System.Object.Equals.

Описание правила

Оператор равенства должен быть синтаксически удобным способом доступа к функциям метода Equals. При реализации оператора равенства его логика должна быть идентична логике Equals.

Примечание.

Это правило применяется только к коду Visual Basic. Компилятор C# создает отдельное предупреждение, CS0660.

Устранение нарушений

Чтобы устранить нарушение этого правила, необходимо либо удалить реализацию оператора равенства, либо переопределить Equals, чтобы два метода возвращали одинаковые значения. Если оператор равенства не приводит к несогласованному поведению, можно устранить нарушение, предоставив реализацию Equals, которая вызывает метод Equals в базовом классе.

Когда лучше отключить предупреждения

Можно отключить предупреждение для этого правила, если оператор равенства возвращает то же значение, что и унаследованная реализация Equals. Примеры в этой статье включают тип, который может безопасно отключить предупреждение для этого правила.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

В следующем примере показан класс (ссылочный тип), нарушающий правило.

' This class violates the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        If pt1 Is Nothing OrElse pt2 Is Nothing Then
            Return False
        End If

        If pt1.GetType() <> pt2.GetType() Then
            Return False
        End If

        Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1 = pt2
    End Operator

End Class

В следующем примере нарушение устраняется путем переопределения System.Object.Equals.

' This class satisfies the rule.
Public Class Point

    Public Property X As Integer
    Public Property Y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.X = x
        Me.Y = y
    End Sub

    Public Overrides Function GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean

        If obj = Nothing Then
            Return False
        End If

        If [GetType]() <> obj.GetType() Then
            Return False
        End If

        Dim pt As Point = CType(obj, Point)

        Return X = pt.X AndAlso Y = pt.Y

    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Object.Equals(pt1, pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Not Object.Equals(pt1, pt2)
    End Operator

End Class

См. также