Partilhar via


Permitir novas linhas em todas as interpolações

Observação

Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui mudanças de especificação propostas, juntamente com as informações necessárias durante o design e desenvolvimento do recurso. Estes artigos são publicados até que as alterações de especificações propostas sejam finalizadas e incorporadas na especificação ECMA atual.

Pode haver algumas discrepâncias entre a especificação do recurso e a implementação concluída. Essas diferenças são capturadas nas notas pertinentes da Language Design Meeting (LDM).

Você pode saber mais sobre o processo de adoção de especificações de recursos no padrão de linguagem C# no artigo sobre as especificações .

Resumo

A linguagem atualmente trata cadeias de caracteres interpoladas literais e não literais ($"" e $@"", respectivamente) de forma diferente. A principal diferença sensata para estes é que uma cadeia de caracteres interpolada não literal funciona como uma cadeia de caracteres normal e não pode conter novas linhas em seus segmentos de texto, devendo, em vez disso, usar escapes (como \r\n). Por outro lado, uma string interpolada verbatim pode conter novas linhas nos seus segmentos de texto (como uma string verbatim) e não escapa de novas linhas ou de outro caractere (exceto quando usando "" para escapar de uma aspa em si).

Tudo isto é razoável e não se alterará com esta proposta.

O que não é razoável hoje é que estendamos a restrição de "sem novas linhas" em uma cadeia interpolada não literal para além seus segmentos de texto para as interpolações si mesmas. Isso significa, por exemplo, que você não pode escrever o seguinte:

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

Em última análise, a regra "a interpolação deve ser feita numa única linha" é apenas uma restrição da atual aplicação. Essa restrição realmente não é necessária, pode ser irritante, e seria bastante simples de remover (veja trabalho https://github.com/dotnet/roslyn/pull/54875 para mostrar como). No final, tudo o que ele faz é forçar o dev a colocar as coisas em uma única linha, ou forçá-las em uma sequência interpolada literal (ambas podem ser intragáveis).

As próprias expressões de interpolação não são texto e não devem submeter-se a quaisquer regras de escape ou nova linha.

Mudança de especificação

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
    ;

Discussões LDM

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