Approfondimenti approfonditi apprezzati.
Farò del mio meglio.
Come hanno notato altre risposte, quello che sta succedendo qui è che il compilatore sta rilevando che un'espressione viene utilizzata come un'istruzione . In molte lingue - C, JavaScript e molte altre - è perfettamente legale usare un'espressione come una dichiarazione. 2 + 2;
è legale in queste lingue, anche se questa è un'affermazione che non ha alcun effetto. Alcune espressioni sono utili solo per i loro valori, alcune espressioni sono utili solo per i loro effetti collaterali (come una chiamata a un metodo di ritorno vuoto) e alcune espressioni, purtroppo, sono utili per entrambi. (Come incremento.)
Punto centrale: le affermazioni che consistono solo di espressioni sono quasi certamente errori a meno che quelle espressioni non siano in genere considerate più utili per i loro effetti collaterali rispetto ai loro valori . I progettisti di C # desideravano trovare una via di mezzo, consentendo espressioni che erano generalmente pensate come effetti collaterali, mentre non consentivano quelle che sono anche generalmente considerate utili per i loro valori. L'insieme di espressioni che hanno identificato in C # 1.0 erano incrementi, decrementi, chiamate a metodi, assegnazioni e in qualche modo controverse invocazioni di costruttori.
A PARTIRE: normalmente si pensa a una costruzione di oggetti utilizzata per il valore che produce, non per l'effetto collaterale della costruzione; a mio avviso, consentire new Foo();
è un po 'un malfunzionamento. In particolare, ho visto questo modello nel codice del mondo reale che ha causato un difetto di sicurezza:
catch(FooException ex) { new BarException(ex); }
Può essere sorprendentemente difficile individuare questo difetto se il codice è complicato.
Il compilatore quindi lavora per rilevare tutte le istruzioni che consistono in espressioni che non sono in quell'elenco. In particolare, le espressioni tra parentesi sono identificate proprio come espressioni tra parentesi. Non sono nell'elenco di "consentiti come espressioni di istruzione", quindi non sono consentiti.
Tutto ciò è al servizio di un principio progettuale del linguaggio C #. Se hai digitato (x++);
probabilmente stavi facendo qualcosa di sbagliato . Questo è probabilmente un refuso per M(x++);
o qualche cosa giusta. Ricorda, l'atteggiamento del team del compilatore C # non è " possiamo capire in che modo farlo funzionare? " L'atteggiamento del team del compilatore C # è " se il codice plausibile sembra un probabile errore, informiamo lo sviluppatore ". Agli sviluppatori C # piace questo atteggiamento.
Ora, tutto ciò che ha detto, in realtà ci sono alcuni casi in cui il dispari # specifica C non implicano o statali e tondo che tra parentesi non sono consentiti, ma il compilatore C # li permette comunque. In quasi tutti quei casi la piccola discrepanza tra il comportamento specificato e il comportamento consentito è completamente innocua, quindi gli autori del compilatore non hanno mai risolto questi piccoli bug. Puoi leggere su quelli qui:
C'è una differenza tra return myVar e return (myVar)?