Freigeben über


Zeilenumbrüche in allen Interpolationen zulassen

Anmerkung

Dieser Artikel ist eine Featurespezifikation. Die Spezifikation dient als Designdokument für das Feature. Es enthält vorgeschlagene Spezifikationsänderungen sowie Informationen, die während des Entwurfs und der Entwicklung des Features erforderlich sind. Diese Artikel werden veröffentlicht, bis die vorgeschlagenen Spezifikationsänderungen abgeschlossen und in die aktuelle ECMA-Spezifikation aufgenommen werden.

Es kann einige Abweichungen zwischen der Featurespezifikation und der abgeschlossenen Implementierung geben. Diese Unterschiede sind in den entsprechenden Hinweisen zum Language Design Meeting (LDM) festgehalten.

Weitere Informationen zur Einführung von Funktionen in den C#-Sprachstandard finden Sie im Artikel zu den Spezifikationen.

Zusammenfassung

Die Sprache behandelt heute nicht ausführliche und ausführliche interpolierte Zeichenfolgen ($"" bzw. $@"") unterschiedlich. Der primäre feststellbare Unterschied besteht darin, dass eine nicht ausführliche interpolierte Zeichenfolge wie eine normale Zeichenfolge funktioniert. Ihre Textsegmente dürfen keine Zeilenumbrüche enthalten, sondern müssen stattdessen Escapezeichen (z. B. \r\n) verwenden. Umgekehrt kann eine ausführliche interpolierte Zeichenfolge Zeilenumbrüche in den Textsegmenten enthalten (z. B. eine ausführliche Zeichenfolge). Es müssen keine Escapezeichen für Zeilenumbrüche oder andere Zeichen verwendet werden (außer "" als Escapezeichen für Anführungszeichen).

Dies ist alles vernünftig und wird sich mit diesem Vorschlag nicht ändern.

Es ist heute nicht mehr sinnvoll, die Einschränkung „keine Zeilenumbrüche“ in einer nicht ausführlichen interpolierten Zeichenfolge über die Textsegmente hinaus auf die Interpolationen selbst zu erweitern. Dies bedeutet beispielsweise, dass Sie Folgendes nicht schreiben können:

var v = $"Count is\t: { this.Is.A.Really(long(expr))
                            .That.I.Should(
                                be + able)[
                                    to.Wrap()] }.";

Letzten Endes ist die Regel „Interpolation muss aus einer einzigen Zeile bestehen“ lediglich eine Einschränkung in der aktuellen Implementierung. Diese Einschränkung ist wirklich nicht notwendig und kann lästig sein und wäre ziemlich trivial zu entfernen (siehe Arbeit https://github.com/dotnet/roslyn/pull/54875, um zu zeigen, wie). Sie zwingt die entwickelnden Personen, Elemente in einer einzigen Zeile oder in einer ausführlichen interpolierten Zeichenfolge zu platzieren (beides ist möglicherweise nicht praktikabel).

Bei den Interpolationsausdrücken selbst handelt es sich nicht um Text. Sie sollten nicht an Regeln für Escapezeichen/Zeilenumbrüche gebunden sein.

Spezifikationsänderung

single_regular_balanced_text_character
-    : '<Any character except / (U+002F), @ (U+0040), \" (U+0022), $ (U+0024), ( (U+0028), ) (U+0029), [ (U+005B), ] (U+005D), { (U+007B), } (U+007D) and new_line_character>'
-    | '</ (U+002F), if not directly followed by / (U+002F) or * (U+002A)>'
+    : <Any character except @ (U+0040), \" (U+0022), $ (U+0024), ( (U+0028), ) (U+0029), [ (U+005B), ] (U+005D), { (U+007B), } (U+007D)>
+    | comment
    ;

LDM-Diskussionen

https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md