web-dev-qa-db-ja.com

==を使用して2つの構造体を比較する

C#で等号(==)を使用して2つの構造体を比較しようとしています。私の構造体は次のとおりです。

public struct CisSettings : IEquatable<CisSettings>
{
    public int Gain { get; private set; }
    public int Offset { get; private set; }
    public int Bright { get; private set; }
    public int Contrast { get; private set; }

    public CisSettings(int gain, int offset, int bright, int contrast) : this()
    {
        Gain = gain;
        Offset = offset;
        Bright = bright;
        Contrast = contrast;
    }

    public bool Equals(CisSettings other)
    {
        return Equals(other, this);
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }

        var objectToCompareWith = (CisSettings) obj;

        return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast &&
               objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset;

    }

    public override int GetHashCode()
    {
        var calculation = Gain + Offset + Bright + Contrast;
        return calculation.GetHashCode();
    }
}

クラスで構造体をプロパティとして使用しようとしていますが、構造体が割り当てようとしている値と等しいかどうかを確認したいので、先に進む前にプロパティを示していません次のように、変更されていない場合は変更されています。

public CisSettings TopCisSettings
{
    get { return _topCisSettings; }
    set
    {
        if (_topCisSettings == value)
        {
            return;
        }
        _topCisSettings = value;
        OnPropertyChanged("TopCisSettings");
    }
}

ただし、等価性をチェックする行で、次のエラーが表示されます。

演算子「==」は、タイプ「CisSettings」および「CisSettings」のオペランドには適用できません

なぜこれが起こっているのかわかりませんが、誰かが私を正しい方向に向けることができますか?

46
JMK

==および!=演算子をオーバーロードする必要があります。これをstructに追加します:

public static bool operator ==(CisSettings c1, CisSettings c2) 
{
    return c1.Equals(c2);
}

public static bool operator !=(CisSettings c1, CisSettings c2) 
{
   return !c1.Equals(c2);
}
77
Jens Kloster

.Equalsメソッドをオーバーライドすると、==演算子は自動的にオーバーロードされません。明示的に行う必要があります。

Equals()およびOperator == をオーバーライドするためのガイドラインも参照してください。

4
Hans Kesting

「==」演算子をオーバーロードする必要がありますが、「!=」演算子もオーバーロードする必要があります。 ( この注をご覧ください

オーバーロード演算子の場合、 このページを参照

1
Xaruth

明示的に実装する または 等号演算子 ではないため、==は、タイプに対して特に定義されていません。

1
Grant Thomas

演算子をオーバーロードする必要があるのは、次のような方法です。

public static bool operator ==(CisSettings a, CisSettings b)
{
    return a.Equals(b);
}
1
Denys Denysenko

Operator ==を明示的にオーバーライドする必要があります。

_public static bool operator ==(CisSettings x, CisSettings y) 
{
   return x.Equals(y);
}
_

ちなみに、比較コードをpublic bool Equals(CisSettings other)に入れて、bool Equals(object obj)bool Equals(CisSettings other)を呼び出すようにすると、不要な型を回避してパフォーマンスを向上させることができます。チェック。

1
Chen