Имеется класс, равенство экземпляров которого необходимо проверить по произвольному алгоритму. Допустим, равенство между объектами класса есть равенство между их полями 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);
}
}
Всем спасибо.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.