Поделиться через


CA2231: перегружать равенство операторов следует при перегрузке ValueType.Equals

TypeName

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA2231

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Тип значения переопределяет Object.Equals,но не реализует оператор равенства.

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

В большинстве языков программирования для типов значений не существует реализации оператора равенства (==) по умолчанию.Если используемый язык программирования поддерживает перегрузки операторов, следует рассмотреть возможность реализации оператора равенства.Его поведение должно быть идентично поведению Equals.

Заданный по умолчанию оператор равенства нельзя использовать в перегруженной реализации оператора равенства.Это может привести к переполнению стека.Для реализации оператора равенства воспользуйтесь методом Object.Equals.Примеры.

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

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

Чтобы устранить нарушение данного правила, реализуйте оператор равенства.

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

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

Пример

В следующем примере определяется тип, нарушающий это правило.

using System;

namespace UsageLibrary
{
    public struct PointWithoutHash
    {
        private int x,y;

        public PointWithoutHash(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public override string ToString()
        {
            return String.Format("({0},{1})",x,y);
        }

        public int X {get {return x;}}

        public int Y {get {return x;}}

        // Violates rule: OverrideGetHashCodeOnOverridingEquals. 
        // Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals. 
        public override bool Equals (object obj)
        {
            if (obj.GetType() != typeof(PointWithoutHash))
                return false;

            PointWithoutHash p = (PointWithoutHash)obj;   
            return ((this.x == p.x) && (this.y == p.y));
        }

    }

}

Связанные правила

CA1046: не перегружайте оператор равенства для ссылочных типов

CA2225: для перезагрузок оператора существуют дополнения с именами

CA2226: перегрузки операторов должны быть симметричны

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

CA2218: переопределяйте GetHashCode при переопределении Equals

См. также

Ссылки

Object.Equals