Overloading == operator

Refresh

December 2018

Views

449 time

3

A derives directly from Object class and neither A or Object overload == operator, so why doesn't next code cause an error:

class Program
{
    static void Main(string[] args)
    {
        A a1 = new A();
        A a2 = new A();

        if (a1 == a2) ... ;
    }
}

class A { }

thanx

6 answers

1

По умолчанию оператор == тесты на равенство ссылок по определению, если две ссылки указывают на один и тот же объект, поэтому ссылочные типы не должны реализовывать оператор ==, чтобы получить эту функциональность.

От: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

Важный бит относительно вашего вопроса бытия:

ссылочные типы не должны реализовывать == оператора для того, чтобы получить эту возможность

3

Объекты имеют реализацию по умолчанию на ==операторе , который проверяет , если они относятся к одному объекту (ссылка сравнения). Таким образом , нет никаких оснований для того , чтобы быть ошибкой. Оператор имеет смысл.

3

Поскольку Objectимеет реализацию по умолчанию , сравнивая ссылки.

4

Поскольку по умолчанию оператор == сравнивает ссылки (ячейки памяти) объектов a1и a2. И потому , что они разные экземпляры класса A, выражение a1 == a2всегда оценивается как ложное в вашем примере.

buc
6

Происходит непосредственно из класса Object и ни А или объект перегрузки == оператора, так почему же не следующий код вызовет ошибку?

Как с другим вопросом, вы , кажется, есть какое - то странное убеждение , что ли перегруженный оператор существует имеют какое - либо отношение может ли быть осмысленно выбран оператором. Это не .

Опять же, чтобы разрешить эту ситуацию разрешения перегрузки первой попытки определить, есть ли определенный пользователем оператор, определенный на любом из операндов. Как вы заметили, не существует.

Разрешение перегрузки затем возвращается на встроенных операторов. Как я уже говорил в другой Ваш вопрос, встроенные операторы являются операторы равенства на междунар, UINT, длинные, ULong, BOOL, полукокса, флоат, двойной, десятичной, объект, строка, все типы делегатов и всех типов перечислений, плюс поднял к обнуляемому версии всех типов значений.

Учитывая эти операторы теперь мы должны определить, действующие из них. Там нет неявного преобразования из «A» на любой из типов значений, к любому из обнуляемых типов значений, в строку, или к любому типу делегата.

Единственный оставшийся применимый кандидат является объектом.

Если разрешение перегрузки выбирает оператор равенства, сравнивающие два объекта, дополнительные ограничения должны быть соблюдены. В частности, оба операнда должны быть либо пустым или ссылочный тип, или параметр типа не ограничивается, чтобы быть типом значения. Это ограничение удовлетворяется. Кроме того, если обе стороны имеют тип, то типы операндов должны иметь какое-то отношение совместимости; вы не можете сделать «MyString == MyException», потому что нет никакой связи между строкой и Exception. Существует взаимосвязь между «А» и «А», а именно, они идентичны.

Поэтому оператор ссылки равенства выбирается, а == означает «сравнить эти два выражения объекта по ссылке».

Я озадачен, почему вы считаете, имеющими определенным пользователемом оператор == не имеет ничего общего с этим, либо в этом вопросе или другой вопросе. Отсутствие такого метода не мешает компилятору генерировать любой код, он любит для этого выражения. Вы можете объяснить?

2

Основание в ==оператор называется то , почему его не дает каких - либо ошибок.