Frage

public void Finalise()
    ProcessFinalisation(true);

Kompiliert nicht, aber die richtige Version:

public void Finalise()
{
    ProcessFinalisation(true);
}

Lässt sich (natürlich) gut kompilieren.

Wenn ich ifs ohne Klammern erlaube, wenn der folgende Code nur eine Zeile hat:

if(true)
    CallMethod();

Warum ist das Gleiche nicht für Methoden mit einer folgenden Zeile zulässig?Gibt es einen technischen Grund?

War es hilfreich?

Lösung

Seit c # 6.0 können Sie erklären: generasacodicetagpre.

und nennen Sie es dann wie üblich: generasacodicetagpre.

Andere Tipps

Die offensichtliche Antwort ist die Sprachspezifikation.zur Begründung...Ich denke, hauptsächlich Einfachheit – es hat sich einfach nicht gelohnt, die Spezifikation und den Compiler für die Plausibilitätsprüfung zu überprüfen winzig winzig Anzahl der Single-Statement-Methoden.Insbesondere kann ich möglicherweise Probleme mit generischen Einschränkungen usw. erkennen (z. B. where T : IBlah, new() am Ende der Signatur).

Beachten Sie, dass der Verzicht auf die Klammern manchmal zu Unklarheiten führen kann und an manchen Stellen verpönt ist.Ich persönlich bin da etwas pragmatischer, aber jeder für sich.

Es könnte auch von Interesse sein, dass C# in Razor steckt erlaubt nicht Verwendung ohne explizite Klammern.Überhaupt (d. h.sogar für if usw).

marc ist grundsätzlich rechts. Um auf seiner Antwort ein bisschen zu erweitern: Es gibt eine Reihe von Orten, an denen C # einen verspannten Anweisungsblock erfordert, anstatt eine "nackte" Anweisung zuzulassen. Sie sind:

  • der Körper einer Methode, Konstruktor, Destruktor, Eigenschaftsanschlüsse, Ereignisanschlüsse oder Indexer-Accessor.
  • der Block eines Versuchs, fangen, schließlich überprüft, unkontrolliert oder unsicher.
  • der Block einer Anweisung Lambda oder anonymer Methode
  • Der Block einer IF- oder Loop-Anweisung, wenn der Block direkt eine lokale variable Erklärung enthält. (Das heißt, "während (x!= 10) int y= 123;" ist illegal; Sie müssen die Erklärung stützen.)

    In jedem dieser Fälle könnte es möglich sein, eine eindeutige Grammatik (oder Heuristiken, um eine mehrdeutige Grammatik auszuräumen) für das Merkmal, in dem eine einzige ungebrachte Erklärung legal ist. Aber was wäre der Punkt? In jeder dieser Situationen erwarten Sie mehrere Aussagen; Einzelne Aussagen sind der seltene, unwahrscheinliche Fall. Es scheint, als ob es nicht wirklich es wert ist, die Grammatik für diese sehr unwahrscheinlichen Fällen eindeutig zu machen.

kurze antwort: c # ist nach c gestaltet, und c-Mandate, die Funktionen verspannt werden, da C-Funktionserklärungen verwendet werden.

lange Version mit Geschichte: Zurück in K & R c wurden Funktionen so deklariert: generasacodicetagpre.

Natürlich können Sie in dieser Anordnung keine ungebremsten Funktionen haben.ANSI C Die Syntax, die wir alle kennen und lieben: generasacodicetagpre.

es jedoch nicht zulässt, nicht in derb-Funktionen zuzulassen, da sie mit älteren Compilern Havoc verursachen würden, die nur K & R-Syntax kenne [und die Unterstützung für K & R-Erklärungen ist noch erforderlich].

Die Zeit ging weiter, und die Jahre später wurde C # um C [oder C ++, gleicher Unterschied in der Syntax] entworfen, und da C nicht ungebrüllte Funktionen erlaubte, weder C #.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top