Подтвердить что ты не робот

Сравнение двух структур с использованием ==

Я пытаюсь сравнить две структуры с использованием equals (==) в С#. Моя структура ниже:

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();
    }
}

Я пытаюсь создать struct как свойство в своем классе и хочу проверить, равна ли структура равному значению, которое я пытаюсь назначить, прежде чем идти дальше и делать это, поэтому я не указав, что свойство изменилось, когда оно отсутствует, например:

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

Однако в строке, где я проверяю равенство, я получаю эту ошибку:

Оператор '==' не может применяться к операндам типа 'CisSettings' и 'CisSettings'

Я не могу понять, почему это происходит, может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

Вам нужно перегрузить операторы == и !=. Добавьте это в свой 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);
}

Ответ 3

Вы не явно реализуете оператор , поэтому == не определен специально для типа.

Ответ 4

Вы должны перегрузить оператора следующим образом:

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

Ответ 5

Вы должны явно переопределить оператор ==.

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), чтобы вы могли получить некоторую производительность, избегая ненужной проверки типа.