Povolit nové řádky ve všech interpolacích
Poznámka
Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.
Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v příslušných poznámkách ze schůzky o návrhu jazyka (LDM) .
Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .
- [x] Navrženo
- [x] Implementace: https://github.com/dotnet/roslyn/pull/56853
- [x] Specifikace: tento soubor.
Shrnutí
Jazyk dnes pracuje s nedoslovnými a doslovnými interpolovanými řetězci ($""
a $@""
) odlišně. Primární významný rozdíl spočívá v tom, že neslovně interpolovaný řetězec funguje jako normální řetězec a nemůže obsahovat nové řádky ve svých textových segmentech, a musí místo toho používat únikové sekvence (například \r\n
). Naopak doslovný interpolovaný řetězec může v textových segmentech obsahovat nové řádky (jako doslovný řetězec) a neuniká znakům jako nové řádky nebo jiným (s výjimkou ""
, které slouží k únikům uvozovek).
To je všechno rozumné a nebude se s tímto návrhem měnit.
V současné chvíli je nerozumné, že rozšiřujeme omezení "žádné nové řádky" v nedoslovném interpolovaném řetězci nad rámec jeho textových segmentů do interpolací samé. To znamená, že například nemůžete napsat následující:
var v = $"Count is\t: { this.Is.A.Really(long(expr))
.That.I.Should(
be + able)[
to.Wrap()] }.";
Ve skutečnosti je pravidlo, že interpolace musí být na jednom řádku, jen omezením aktuální implementace. Toto omezení opravdu není nutné, může být otravné a bylo by poměrně jednoduché jej odstranit (viz projekt https://github.com/dotnet/roslyn/pull/54875, kde se ukazuje jak na to). Nakonec to vývojáře donutí umístit věci na jeden řádek, nebo je vynutit do doslovného interpolovaného řetězce (obojí může být nepřijatelné).
Samotné interpolační výrazy nejsou textem a neměly by podléhat žádným pravidlům pro úniky nebo nové řádky.
Změna specifikace
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
;
Diskuze o LDM
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications