67

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」のオペランドには適用できません

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

4

8 に答える 8

103

==and!=演算子をオーバーロードする必要があります。これをあなたに追加してください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);
}
于 2013-03-04T10:13:51.820 に答える
9

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

Equals() および演算子 == をオーバーライドするためのガイドラインまたはCA1815: 値の型で equals および operator equals をオーバーライドするも参照してください。

于 2013-03-04T10:14:02.473 に答える
2

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

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)

于 2013-03-04T10:16:49.263 に答える
2

等値演算子を明示的に実装しないため、型に対して特に定義されていません。==

于 2013-03-04T10:14:17.017 に答える
2

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

public static bool operator ==(CisSettings a, CisSettings b)
{
    return a.Equals(b);
}
于 2013-03-04T10:15:11.930 に答える
1

「==」演算子をオーバーロードする必要がありますが、「!=」演算子もオーバーロードする必要があります。(このノートを見てください)

オーバーロード演算子については、このページを参照してください

于 2013-03-04T10:20:02.640 に答える