Zeilenumbrüche in allen Interpolationen erlauben
Hinweis
Dieser Artikel ist eine Feature-Spezifikation. 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 Feature-Spezifikation und der abgeschlossenen Implementierung geben. Diese Unterschiede werden in den entsprechenden Hinweisen zum Language Design Meeting (LDM) erfasst.
Weitere Informationen zum Prozess für die Aufnahme von Funktions-Speclets in den C#-Sprachstandard finden Sie im Artikel zu den Spezifikationen.
Champion Issue: https://github.com/dotnet/csharplang/issues/1528
- [x] Vorgeschlagen
- [x] Implementierung: https://github.com/dotnet/roslyn/pull/56853
- [x] Spezifikation: diese Datei.
Zusammenfassung
Die Sprache behandelt derzeit nicht-verbatim und verbatim interpolierte Zeichenketten ($""
und $@""
jeweils) unterschiedlich. Der primäre logische Unterschied zwischen diesen ist, dass eine nicht-verbatim interpolierte Zeichenkette wie eine normale Zeichenkette funktioniert und keine Zeilenumbrüche in ihren Textsegmenten enthalten kannn. Stattdessen müssen Escapes (wie \r\n
) verwendet werden. Im Gegensatz dazu kann eine verbatim interpolierte Zeichenkette Zeilenumbrüche in ihren Textsegmenten enthalten (wie eine verbatim-Zeichenkette) und benötigt keine Escapes für Zeilenumbrüche oder andere Zeichen (außer für ""
, um ein Anführungszeichen selbst zu escapen).
Das ist alles vernünftig und wird sich durch diesen Vorschlag nicht ändern.
Was heute unvernünftig ist, ist, dass wir die Einschränkung 'keine Zeilenumbrüche' in einer nicht-verbatim interpolierten Zeichenkette über ihre Textsegmente hinaus auf die Interpolationen selbst ausweiten. Das bedeutet zum Beispiel, 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()] }.";
Letztlich ist die Regel, dass die 'Interpolation selbst in einer einzigen Zeile sein muss', nur eine Einschränkung der aktuellen Implementierung. Diese Einschränkung ist wirklich nicht notwendig und kann lästig sein und wäre ziemlich einfach zu entfernen (siehe Arbeit https://github.com/dotnet/roslyn/pull/54875, um zu zeigen, wie). Am Ende zwingt es den Entwickler lediglich dazu, Dinge in einer einzigen Zeile unterzubringen oder sie in eine verbatim interpolierte Zeichenkette zu zwingen (was beides möglicherweise unpraktisch ist).
Die Interpolationsausdrücke selbst sind kein Text und sollten daher keinen Regeln zu Escapes oder Zeilenumbrüchen unterliegen.
Änderung der Spezifikation
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
C# feature specifications