Tiefe Einsichten geschätzt.
Ich werde mein Bestes geben.
Wie andere Antworten angemerkt haben, erkennt der Compiler hier, dass ein Ausdruck als Anweisung verwendet wird . In vielen Sprachen - C, JavaScript und vielen anderen - ist es völlig legal, einen Ausdruck als Aussage zu verwenden. 2 + 2;
ist in diesen Sprachen legal, obwohl dies eine Aussage ist, die keine Wirkung hat. Einige Ausdrücke sind nur für ihre Werte nützlich, einige Ausdrücke sind nur für ihre Nebenwirkungen nützlich (z. B. ein Aufruf einer Methode zur Rückgabe von Leeren) und einige Ausdrücke sind leider für beide nützlich. (Wie Inkrement.)
Punkt ist: Aussagen, die nur aus Ausdrücken bestehen, sind mit ziemlicher Sicherheit Fehler, es sei denn, diese Ausdrücke werden normalerweise als nützlicher für ihre Nebenwirkungen angesehen als ihre Werte . C # -Designer wollten einen Mittelweg finden, indem sie Ausdrücke zuließen, die allgemein als Nebenwirkungen angesehen wurden, während diejenigen, die normalerweise auch als nützlich für ihre Werte angesehen werden, nicht zugelassen wurden. Die in C # 1.0 identifizierten Ausdrücke waren Inkremente, Dekremente, Methodenaufrufe, Zuweisungen und etwas kontrovers diskutierte Konstruktoraufrufe.
ASIDE: Normalerweise wird eine Objektkonstruktion als für den Wert verwendet angesehen, den sie erzeugt, nicht für den Nebeneffekt der Konstruktion. Meiner Meinung nach ist das Zulassen new Foo();
eine Fehlfunktion. Insbesondere habe ich dieses Muster im realen Code gesehen, der einen Sicherheitsmangel verursacht hat:
catch(FooException ex) { new BarException(ex); }
Es kann überraschend schwierig sein, diesen Fehler zu erkennen, wenn der Code kompliziert ist.
Der Compiler erkennt daher alle Anweisungen, die aus Ausdrücken bestehen, die nicht in dieser Liste enthalten sind. Insbesondere werden Ausdrücke in Klammern als genau das identifiziert - Ausdrücke in Klammern. Sie sind nicht auf der Liste der "als Anweisungsausdrücke zugelassen" aufgeführt, daher sind sie nicht zulässig.
All dies dient einem Entwurfsprinzip der C # -Sprache. Wenn Sie getippt haben, haben (x++);
Sie wahrscheinlich etwas falsch gemacht . Dies ist wahrscheinlich ein Tippfehler für M(x++);
oder eine gerechte Sache. Denken Sie daran, dass die Haltung des C # -Compilerteams nicht lautet: " Können wir einen Weg finden, wie dies funktioniert? " Die Haltung des C # -Compilerteams lautet: " Wenn plausibler Code wie ein wahrscheinlicher Fehler aussieht, informieren wir den Entwickler. " C # -Entwickler mögen diese Einstellung.
Nun, alles in allem gibt es tatsächlich einige seltsame Fälle, in denen die C # -Spezifikation impliziert oder direkt besagt , dass Klammern nicht zulässig sind, der C # -Compiler sie jedoch trotzdem zulässt. In fast allen diesen Fällen ist die geringfügige Diskrepanz zwischen dem angegebenen Verhalten und dem zulässigen Verhalten völlig harmlos, sodass die Compiler-Autoren diese kleinen Fehler nie behoben haben. Über diese können Sie hier lesen:
Gibt es einen Unterschied zwischen return myVar und return (myVar)?