Nieuwe regeleindes in alle interpolaties toestaan
Notitie
Dit artikel is een functiespecificatie. De specificatie fungeert als het ontwerpdocument voor de functie. Het bevat voorgestelde specificatiewijzigingen, samen met informatie die nodig is tijdens het ontwerp en de ontwikkeling van de functie. Deze artikelen worden gepubliceerd totdat de voorgestelde specificaties zijn voltooid en opgenomen in de huidige ECMA-specificatie.
Er kunnen enkele verschillen zijn tussen de functiespecificatie en de voltooide implementatie. Deze verschillen worden vastgelegd in de relevante notities van de taalonwerpvergadering (LDM).
Meer informatie over het proces voor het aannemen van functiespeclets in de C#-taalstandaard vindt u in het artikel over de specificaties.
- [x] Voorgesteld
- [x] Implementatie: https://github.com/dotnet/roslyn/pull/56853
- [x] Specificatie: dit bestand.
Samenvatting
De taal behandelt tegenwoordig niet-letterlijke en letterlijke geïnterpoleerde tekenreeksen (respectievelijk$""
en $@""
) anders. De primaire verstandige verschil hiervoor is dat een niet-letterlijk geïnterpoleerde tekenreeks werkt als een normale tekenreeks en geen nieuwe regels in de tekstsegmenten mag bevatten en in plaats daarvan escapes moet gebruiken (zoals \r\n
). Omgekeerd kan een letterlijk geïnterpoleerde tekenreeks nieuwe regels in de tekstsegmenten (zoals een exacte tekenreeks) bevatten en geen nieuwe regels of andere tekens ontsnappen (met uitzondering van ""
om een aanhalingsteken zelf te ontsnappen).
Dit is allemaal redelijk en zal niet veranderen met dit voorstel.
Wat vandaag onredelijk is, is dat we de restrictie "geen regelafbrekingen" in een niet-letterlijk geïnterpoleerde string uitbreiden, voorbij de tekstsegmenten ervan naar de interpolaties zelf. Dit betekent bijvoorbeeld dat u het volgende niet kunt schrijven:
var v = $"Count is\t: { this.Is.A.Really(long(expr))
.That.I.Should(
be + able)[
to.Wrap()] }.";
Uiteindelijk is de regel dat 'interpolatie op een enkele regel moet staan' slechts een beperking van de huidige implementatie. Die beperking is echt niet nodig en kan vervelend zijn en zou redelijk triviaal zijn om te verwijderen (zie werk https://github.com/dotnet/roslyn/pull/54875 om te laten zien hoe). Uiteindelijk dwingt het de ontwikkelaar om dingen op één regel te zetten of om een letterlijke geïnterpoleerde string te gebruiken, wat beide onaangenaam kan zijn.
De interpolatie-expressies zelf zijn geen tekst en zouden niet onderworpen moeten zijn aan escape- of newlineregels daarin.
Specificatiewijziging
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-discussies
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications