Сравнение двух структур с использованием ==
Я пытаюсь сравнить две структуры с использованием 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'
Я не могу понять, почему это происходит, может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 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);
}
Ответ 2
Когда вы переопределяете метод .Equals, оператор ==
не будет автоматически перегружен. Вам нужно сделать это явно.
См. также Рекомендации по переопределению равных() и операторов ==.
Ответ 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)
, чтобы вы могли получить некоторую производительность, избегая ненужной проверки типа.
Ответ 6
вы должны перегрузить оператор "==", но также перегрузить оператор "! =". (Посмотрите на эту заметку)
Для оператора перегрузки см. эту страницу