Warum war die Aussage (j++); verboten?
Dem folgenden code falsch ist (sehe es auf ideone):
public class Test
{
public static void Main()
{
int j = 5;
(j++); //if we remove the "(" and ")" then this compiles fine.
}
}
Fehler CS0201: Nur Zuordnung, call -, increment -, decrement, erwarten, und
neue Objekt-Ausdrücke können verwendet werden als eine Aussage
- Warum funktioniert der code kompiliert werden, wenn wir entfernen Sie die Klammern?
- Warum es nicht kompiliert, mit den Klammern?
- Warum wurde C# entwickelt werden?
- viele Leute, die mit C# design-Sprache sind SO, so das ist, warum ich fragte. Nichts falsch mit diesem?
- Der compiler erwartet eine Erklärung hier, aber diese Klammern einen Wert.
- Ich kann mir nicht vorstellen, eine mehr on-topic-Frage als "warum ist eine spezifische Programmiersprache, die Behandlung dieser spezifischen Verhalten in dieser Weise?"
- fühlt sich an wie es würde fallen unter eine Konstruktive subjektive Frage, stackoverflow.com/help/dont-ask
- In Anbetracht der Antwort bereits angezogen 4 Antworten, die sich nicht an diese Punkte, klar ist es nicht. Es ist auch nicht eine spezifisch praktische Programm problem.
- von der Frage, jemand könnte vernünftigerweise Pontifikat auf den Zweck dahinter, warum es nicht gültig ist ("Tiefe Einblicke geschätzt"). Es gibt einige sehr Auskunftsfreudig C# Experten, wer könnte Sie verstehen die Konsequenzen der Entscheidung, obwohl Sie nicht der Schöpfer der Sprache. Die Tatsache, dass die Antworten nicht bereits geschehen ist, ist vielleicht eine Reflexion von der Klarheit der Frage, aber nicht die Absicht - für was es Wert ist, das war meine Lektüre, aber ich habe nicht das know-how zu beantworten.
- Jetzt haben wir eine Antwort von Eric Lippert. Vielleicht möchten Sie zu überdenken Ihre Entscheidung über die akzeptierte Antwort. Es ist Weihnachten, also vielleicht haben Sie akzeptiert die Antwort zu früh.
- Willst du damit sagen, dass design-Entscheidungen sind nie dokumentiert, und sind absolut unbekannt, auf alle anderen zu? Er ist nicht zu Fragen, SO dass Benutzer nicht zu erraten ist, bittet er um eine Antwort - das bedeutet nicht, dass er bittet um eine Vermutung. Ob die Menschen beantworten, die mit einer Vermutung auf Sie, nicht ihn. Und als OP darauf hingewiesen, es gibt Menschen auf stack overflow, die tatsächlich arbeiten an C# - und diese Entscheidungen getroffen.
- Er ist nicht impliziert, dass design-Entscheidungen sind nie dokumentiert. Er ist auch nicht impliziert, dass die Frage nicht interessant. Er sagt, dass die Frage wahrscheinlich Bedürfnisse eine Antwort von den Autoren selbst, und damit ist nicht geeignet für SO, wie es führt zu wilden Spekulationen, wie hier gezeigt. Eric Lippert wird heute als MAßGEBEND, da könnte jemand Fragen, der speichert diese Frage.
- Gut, ich bin nicht einverstanden; ich nicht glaube, dass eine Antwort kommen müssen von den Autoren selbst, obwohl Sie natürlich Ihre Antwort wäre das bestmögliche Ergebnis. Viele Fragen führen können, zu wilden Spekulationen, aber das ist ein problem der Beantworter, nicht der Fragesteller. Es gibt viele Menschen, die nach Vermutungen als Antworten; das macht die Antwort schlecht, keine Frage.
- Das problem ist, dass, ja, es sei denn, die Begründung ist schon irgendwo dokumentiert, muss es aber Spekulation ist Spaß und wer möchte nicht seinen eigenen? Wenn Sie einen Weg finden, um sicherzustellen, dass diese Reine (oder "erzogen") Vermutungen sind zuverlässig gekeult, Sag es mir und wir werden ein Vermögen machen.
- Ich bin mehr daran interessiert zu wissen, wenn Sie tun können, dass in alle Sprache und warum würden Sie wollen? Es ist scheußlich und macht sehr wenig Sinn.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde mein bestes tun.
Anderen Antworten gemerkt haben, was hier Los ist, ist der compiler erkennt, dass ein Ausdruck als Anweisung. In vielen Sprachen -- C -, JavaScript-und viele andere-es ist völlig legal um einen Ausdruck zu verwenden, als ein statement.
2 + 2;
legal ist in diesen Sprachen, obwohl dies ist eine Anweisung, die keine Wirkung hat. Einige Ausdrücke sind nützlich, nur für Ihre Werte, einige Ausdrücke sind nützlich, nur für Ihre Nebenwirkungen (wie z.B. ein Aufruf einer void-Rückgabe-Methode) und einige Ausdrücke, leider sind nützlich für beide. (Wie Inkrement.)Punkt: Aussagen, die bestehen nur aus Ausdrücken sind fast sicher Fehler es sei denn, diese Ausdrücke werden normalerweise als nützlicher für Ihre Nebenwirkungen als Ihre Werte. C# - Designer wollte einen Mittelweg finden, indem Sie Ausdrücke, die waren in der Regel gedacht als Nebenwirkungen bewirken, zu erlauben und diejenigen, die sind auch normalerweise als nützlich für Ihre Werte. Die Menge der Ausdrücke, die Sie identifiziert in C# 1.0 wurden, inkrementiert, dekrementiert, Methodenaufrufe, Zuweisungen und etwas kontrovers, Konstruktor aufrufen.
BEISEITE: das Man normalerweise denkt eine Objekt-Bau verwendet wird, für den Wert, den es produziert, nicht für den Nebeneffekt der Konstruktion, meiner Meinung nach ermöglicht
new Foo();
ist ein bisschen ein misfeature. Insbesondere, ich habe gesehen, dass dieses Muster in der realen Welt code, der verursacht, ein Sicherheits-Mangel:Es kann überraschend schwer zu erkennen ist dieser Mangel, wenn der code kompliziert ist.
Den compiler arbeitet also zu erkennen, alle Aussagen, die sich aus Ausdrücken, die nicht auf dieser Liste. Insbesondere werden auch die eingeklammerten Ausdrücke identifiziert werden, als nur das-auch die eingeklammerten Ausdrücke. Sie sind nicht auf der Liste der "allowed as-Anweisung Ausdrücken", so dass Sie nicht zulässig sind.
All dies ist im service eines design-Prinzip der Sprache C#. Wenn Sie getippt
(x++);
waren Sie wahrscheinlich etwas falsch. Dies ist wahrscheinlich ein Tippfehler fürM(x++);
oder so was. Denken Sie daran, die Haltung der C# - compiler-team ist nicht "können wir herausfinden, einige Weg, um diese Arbeit zu machen?" Die Haltung der C# - compiler-team "wenn plausibel code sieht aus wie ein wahrscheinlicher Fehler, lassen Sie uns informieren Sie den Entwickler". C# - Entwickler wie diese Haltung.Nun, alles, was gesagt, es gibt tatsächlich ein paar vereinzelte Fälle, in denen der C# - Spezifikation hat vorzugeben oder zu erklären geradezu, dass Klammern nicht zulässig sind, sondern der C# - compiler erlaubt es Ihnen sowieso. In fast allen diesen Fällen wird die geringfügige Diskrepanz zwischen dem angegebenen Verhalten und das erlaubte Verhalten ist völlig harmlos, so dass die compiler-Autoren haben nie repariert diese kleinen bugs. Erfahren Sie mehr über diese hier:
Gibt es einen Unterschied zwischen return myVar vs. Rendite (myVar)?
... ? ... : ...
, wo die Korrektur ist die Verwendungif
/else
statt.)contineu;
.new Foo()
als ein statement, es ist ein schlechtes design pattern im Allgemeinen, obwohl es möglich ist, um zu sehen, eine kleine Anzahl von Situationen, in denen es nützlich sein könnte. ZB, Stell dir vor, es war ein Weg, um erstellen Sie eine neueThread
(oder benutzerdefinierte Gewinde-Objekt), die automatisch starten, und damit keine Notwendigkeit zu tunnew Thread(...).Start();
, die befriedigt das Bedürfnis zu Anruf etwas. Ich kann nicht sofort an ein Beispiel denken, aber ich wäre nicht überrascht, wenn es etwas ist nützlich Ausgabe im Konstruktor (natürlich, es müsste in der Lage sein, mehr zu rechtfertigen anlegen eines neuen Objekts in der Regel).try { new Foo(null); } catch (ArgumentNullException)...
aber offensichtlich sind diese Situationen sind per definition nicht für die Produktion von code. Es scheint vernünftig, dass ein solcher code geschrieben werden kann, zu ordnen, um eine dummy-variable.In der C# - programmiersprachenspezifikation
Setzen Sie Klammern, um eine Anweisung erstellt eine neue, so genannte eingeklammerte Ausdruck. Aus der Spezifikation:
Da werden auch die eingeklammerten Ausdrücke werden nicht aufgeführt, da ein Gültiger Ausdruck, es ist nicht eine gültige Aussage, nach der Spezifikation. Warum die Entwickler entschieden, es zu tun auf diese Weise, ist Reine Vermutung, aber meine Wette ist, weil die Klammern nicht sinnvoll funktionieren, wenn die gesamte Aussage ist enthalten in Klammern:
stmt
und(stmt)
sind genau die gleichen.OP
ist zu Fragen, nichts über die sprachliche Gestaltung. Er will einfach nur wissen, warum dies ist ein Fehler. Die Antwort ist: weil es keine gültige Anweisung.weil die Klammern um die
i++
erstellen/einen Ausdruck definieren.. wie die Fehlermeldung sagt.. ein einfacher Ausdruck kann nicht verwendet werden, als eine Aussage.warum wurde die Sprache entwickelt, um sich auf diese Weise? um zu verhindern, dass Fehler, dass irreführende Ausdrücke als Anweisungen, dass keine Nebenwirkung wie haben Sie den code
in der zweiten Zeile hat keine Wirkung(aber Sie können nicht bemerkt haben). Aber anstatt den compiler, es zu entfernen(weil der code ist nicht erforderlich).es fordert ausdrücklich, um es zu entfernen(so dass Sie sich bewusst sein, oder der Fehler), ODER beheben Sie, falls Sie vergessen haben, etwas zu geben.
Bearbeiten:
machen das Teil über bracked mehr klar.. Klammern in c# (neben anderen verwendet, wie Guss-und function call), werden verwendet, um Ausdrücke zu gruppieren und wieder einen einzelnen Ausdruck (der sub-Ausdrücke).
auf dieser Ebene der code nur staments sind erlaubt.. so
aber mit der bracked wenden Sie es in als Ausdruck
und diese
ist nicht gültig, da der compiler kippe asure Sie, dass der Ausdruck als Nebenwirkung.(nicht ohne in der Halteproblem)..
j
variable richtig?j++;
ist eine gültige Aussage, aber durch die Verwendung der Klammern, die Sie sagenlet me take this stement and turn it into an expression
.. und expresions sind nicht gültig an diesem Punkt im code