Secondo le specifiche, questo è il comportamento previsto.
Il comportamento del primo è governato dalla sezione 7.3 della specifica:
Operandi in un'espressione vengono valutate da sinistra a destra. Ad esempio, in F(i) + G(i++) * H(i)
, il metodo F viene chiamato utilizzando il vecchio valore di i, quindi il metodo G viene chiamato con il vecchio valore di i e, infine, il metodo H viene chiamato con il nuovo valore di i. Questo è separato e non correlato alla precedenza degli operatori.
Così nel x==x++
, prima l'operando sinistro è valutato (0
), poi il destro viene valutato (0
, x
diventa 1
), quindi il confronto è fatto: 0 == 0
è vero.
Il comportamento del secondo è governato dalla sezione 7.5.5:
- Se M è un membro funzione dell'istanza dichiarata in un valore di tipo:
- E viene valutata. Se questa valutazione causa un'eccezione, non vengono eseguiti ulteriori passaggi.
- Se E non è classificato come variabile, viene creata una variabile locale temporanea di tipo E e il valore di E viene assegnato a tale variabile. E viene quindi riclassificato come riferimento a quella variabile locale temporanea. La variabile temporanea è accessibile come questa all'interno di M, ma non in altro modo. Quindi, solo quando E è una variabile vera è possibile che il chiamante osservi le modifiche che M fa a questo.
- L'elenco degli argomenti viene valutato come descritto in §7.5.1.
- M viene invocato. La variabile a cui fa riferimento E diventa la variabile a cui fa riferimento.
Nota che tipi di valore sono passati per riferimento ai loro metodi.
Così in x.Equals(x++)
, prima il bersaglio viene valutata (E è x
, una variabile), allora gli argomenti vengono valutati (0
, x
diventa 1
), quindi il confronto è fatto: x.Equals(0)
è falso.
MODIFICA: volevo anche dare credito al commento ora ritirato di dtb, pubblicato mentre la domanda era chiusa. Penso che stesse dicendo la stessa cosa, ma con la limitazione della lunghezza dei commenti non era in grado di esprimerlo pienamente.
fonte
2010-10-07 20:42:20
@ Moderatori: leggere la domanda completa prima di chiudere qualsiasi domanda. Se hai i diritti per chiudere qualsiasi domanda, usali nel posto giusto. –
@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Dato che tutti voi avete votato per chiudere questa domanda. Per favore forniscimi una risposta adeguata per la domanda posta sopra o riapri la domanda. –