Tillåt nya rader i alla interpoleringar
Not
Den här artikeln är en funktionsspecifikation. Specifikationen fungerar som designdokument för funktionen. Den innehåller föreslagna specifikationsändringar, tillsammans med information som behövs under utformningen och utvecklingen av funktionen. Dessa artiklar publiceras tills de föreslagna specifikationsändringarna har slutförts och införlivats i den aktuella ECMA-specifikationen.
Det kan finnas vissa skillnader mellan funktionsspecifikationen och den slutförda implementeringen. Dessa skillnader återges i de relevanta anteckningarna från LDM (Language Design Meeting) .
Du kan läsa mer om processen för att införa funktionsspecifikationer i C#-språkstandarden i artikeln om specifikationerna.
Championfråga: https://github.com/dotnet/csharplang/issues/1528
- [x] Föreslagen
- [x] Implementering: https://github.com/dotnet/roslyn/pull/56853
- [x] Specifikation: denna fil.
Sammanfattning
Språket behandlar idag icke-ordagranna och ordagranna interpolerade strängar ($""
respektive $@""
) på olika sätt. Den primära förnuftiga skillnaden för dessa är att en icke-ordagrann interpolerad sträng fungerar som en normal sträng och inte kan innehålla nya radlinjer i dess textsegment, och måste i stället använda escapes (som \r\n
). Omvänt kan en ordagrann interpolerad sträng innehålla nya streck i sina textsegment (till exempel en ordagrann sträng) och undfly inte nya eller andra tecken (förutom ""
för att undkomma ett citat).
Allt detta är rimligt och kommer inte att ändras med detta förslag.
Det som är orimligt idag är att vi utökar begränsningen av "inga nya rader" i en icke-ordagrant interpolerad sträng utöver dess textsegment och in i interpolationerna själva. Det innebär till exempel att du inte kan skriva följande:
var v = $"Count is\t: { this.Is.A.Really(long(expr))
.That.I.Should(
be + able)[
to.Wrap()] }.";
I slutändan är "interpoleringen måste finnas på en enda rad" bara en begränsning av det nuvarande genomförandet. Den begränsningen är verkligen inte nödvändig, och kan vara irriterande, och skulle vara ganska trivialt att ta bort (se arbete https://github.com/dotnet/roslyn/pull/54875 för att visa hur). I slutändan är allt det gör att tvinga utvecklaren att placera saker på en enda rad, eller tvinga dem till en ordagrann interpolerad sträng (som båda kan vara osmakliga).
Själva interpoleringsuttrycken är inte text och bör inte vara beroende av eventuella regler för undantag/nya linjer.
Ändring av specifikation
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-diskussioner
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications