В чем разница между оценкой == и 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
В чем разница между оценкой == и 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
В соответствии со спецификацией это ожидаемое поведение.
Поведение первого определяется разделом 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, опубликованному, когда вопрос был закрыт. Я думаю, что он говорил то же самое, но с ограничением длины комментариев, которые он не смог выразить полностью.
Порядок оценки. ++ сначала оценивает (второй пример). Но в первом примере == выполняется сначала.