次の方法で共有


CA2231: ValueType.Equals のオーバーライドで、演算子 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: 参照型で、演算子 equals をオーバーロードしないでください

CA2225: 演算子オーバーロードには名前付けされた代替が存在します

CA2226: 演算子は対称型オーバーロードを含まなければなりません

CA2224: オーバーロードする演算子 equals で Equals をオーバーライドします

CA2218: オーバーライドする Equals で GetHashCode をオーバーライドします

参照

関連項目

Object.Equals