Condividi tramite


Consenti nuove righe in tutte le interpolazioni

Nota

Questo articolo è una specifica di funzionalità. La specifica funge da documento di progettazione per la funzionalità. Include le modifiche specifiche proposte, insieme alle informazioni necessarie durante la progettazione e lo sviluppo della funzionalità. Questi articoli vengono pubblicati fino a quando le modifiche specifiche proposte non vengono completate e incorporate nella specifica ECMA corrente.

Potrebbero verificarsi alcune discrepanze tra la specifica di funzionalità e l'implementazione completata. Tali differenze sono riportate nelle note pertinenti del language design meeting (LDM) .

Puoi trovare ulteriori informazioni sul processo di adozione degli speclet delle funzionalità nello standard del linguaggio C# nell'articolo sulle specifiche di .

Problema del campione: https://github.com/dotnet/csharplang/issues/1528

Sommario

Attualmente, il linguaggio considera le stringhe interpolate non verbatim e verbatim (rispettivamente$"" e $@"") in modo diverso. L'principale differenza sensibile per questi è che una stringa interpolata non verbatim funziona come una stringa normale e non può contenere nuove righe nei relativi segmenti di testo e deve invece usare caratteri di escape (ad esempio ). Al contrario, una stringa interpolata verbatim può contenere nuove righe nei relativi segmenti di testo (ad esempio una stringa verbatim) e non esegue l'escape di nuove righe o altri caratteri (ad eccezione di "" di escape di una virgoletta stessa).

Questo è tutto ragionevole e non cambierà con questa proposta.

Oggi non è possibile estendere la restrizione sulle "nuove righe" in una stringa non verbatim interpolata oltre segmenti di testo nelle interpolazioni stesse. Ciò significa, ad esempio, che non è possibile scrivere quanto segue:

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

In definitiva, la regola "interpolazione deve essere su una sola riga" è solo una restrizione dell'attuale implementazione. Questa restrizione non è veramente necessaria e può essere fastidiosa e sarebbe piuttosto semplice da rimuovere (vedere lavoro https://github.com/dotnet/roslyn/pull/54875 per mostrare come). Alla fine, tutto ciò che fa è costringere il dev a posizionare le cose su una singola riga, oppure costringerle in una stringa interpolata verbatim (entrambe potrebbero essere non appetibili).

Le espressioni di interpolazione non sono testo e non dovrebbero essere assoggettate a regole di escape/di nuova linea.

Modifica delle specifiche

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
    ;

Discussioni LDM

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