== vs Равно в С#

В чем разница между оценкой == и Equals в С#?

Для Ex,

if(x==x++)//Always returns true

но

if(x.Equals(x++))//Always returns false 

Отредактировано:

     int x=0;
     int y=0;

     if(x.Equals(y++))// Returns True

Ответ 1

В соответствии со спецификацией это ожидаемое поведение.

Поведение первого определяется разделом 7.3 спецификации:

Операнды в выражении оцениваются слева направо. Например, в F(i) + G(i++) * H(i) метод F вызывается с использованием старого значения i, тогда метод G вызывается со старым значением i, и, наконец, метод H вызывается с новым значением i. Это отдельно от и не связано с приоритетом оператора.

Таким образом, в x==x++ сначала оценивается левый операнд (0), тогда правая часть оценивается (0, x становится 1), затем выполняется сравнение: 0 == 0 истинно.

Поведение второго определяется разделом 7.5.5:

  • Если M - член функции экземпляра, объявленный в типе значения:
    • E оценивается. Если эта оценка вызывает исключение, то дальнейшие шаги не выполняются.
    • Если E не классифицируется как переменная, тогда создается временная локальная переменная типа Es и ей присваивается значение E. E затем реклассифицируется как ссылка на эту временную локальную переменную. Временная переменная доступна как таковая внутри M, но никак иначе. Таким образом, только тогда, когда E является истинной переменной, возможно, чтобы вызывающий наблюдал изменения, которые M делает с этим.
    • Список аргументов оценивается, как описано в п. 7.5.1.
    • M вызывается. Переменная, на которую ссылается E, становится переменной, на которую ссылается этот символ.

Обратите внимание, что типы значений передаются по ссылке в собственные методы.

Таким образом, в x.Equals(x++) сначала оценивается цель (E - x, переменная), затем оцениваются аргументы (0, x становится 1), затем выполняется сравнение: x.Equals(0) является ложным.

EDIT: Я также хотел отдать должное dtb now-retracted comment, опубликованному, когда вопрос был закрыт. Я думаю, что он говорил то же самое, но с ограничением длины комментариев, которые он не смог выразить полностью.

Ответ 2

Порядок оценки. ++ сначала оценивает (второй пример). Но в первом примере == выполняется сначала.