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