C#: Переопределение оператора ==

программирование C#

Имеется класс, равенство экземпляров которого необходимо проверить по произвольному алгоритму. Допустим, равенство между объектами класса есть равенство между их полями Value.
class MyClass
{
public int Value = -1;
}

Тогда после переопределения ==:
class MyClass
{
public int Value = -1;

public static bool operator ==(MyClass left, MyClass right)
{
return left.Value==right.Value;
}

public static bool operator !=(MyClass left, MyClass right)
{
return !(left == right);
}
}

И тут возникает проблема - как сравнивать с null? Допустим, по логие программы, равными являются два null, если же один null, а другой не null, то объекты не равны. Проблема в том, что если в теле метода
public static bool operator ==(MyClass left, MyClass right)
попытаться использовать оператор ==, например
if (left==null ....
Это приведет к еще одному вызову этого же метода и, в результате, к переполнению стека.

Примечание:
>По-моему когда вы переопределяете оператор == , от вас потребуют переопределить так же методы Equals() и GetHashCode()

Нет. Переопределение оператора == требудет только переопределить так же ит != (вообще все бинарные переопределяются только парами), остальное желательно, но необязательно.

>left is null" или что-то типа IsNull(left) или typeof(left) == Null
Нет. typeof вернет Type (если переменная равна null, то это говорит что у нее тип null) и вобще типа null нет. И поэтому "is null" тоже некорректная запись.

А вот по поводу Equals - это да. Вот работающий код:
class MyClass
{
public int Value = -1;

public static bool operator ==(MyClass left, MyClass right)
{
var left_is_null = MyClass.Equals(null, left);
var right_is_null = MyClass.Equals(null, right);

if (left_is_null || right_is_null)
if (left_is_null && right_is_null)
{
return true;
}
else
{
return false;
}

return left.Value==right.Value;
}

public static bool operator !=(MyClass left, MyClass right)
{
return !(left == right);
}
}

Всем спасибо.
Ответы:
А если использовать не "left == null", a "left is null" или что-то типа IsNull(left) или typeof(left) == Null
Не знаю, как это в C#, но направление, думаю, понятно
По-моему когда вы переопределяете оператор == , от вас потребуют переопределить так же методы Equals() и GetHashCode(). Ну а внутри оператора == собственно и используется метод Equals.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.