Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ela inclui alterações de especificação propostas, juntamente com as informações necessárias durante o design e o desenvolvimento do recurso. Esses artigos são publicados até que as alterações de especificação propostas sejam finalizadas e incorporadas na especificação ECMA atual.
Pode haver algumas divergências entre a especificação do recurso e a implementação concluída. Essas diferenças são capturadas nas notas pertinentes da reunião de design de idioma (LDM).
Você pode saber mais sobre o processo de adoção de speclets de recursos no padrão de linguagem C# no artigo sobre as especificações de .
Problema do especialista: https://github.com/dotnet/csharplang/issues/1528
- [x] Proposto
- [x] Implementação: https://github.com/dotnet/roslyn/pull/56853
- [x] Especificação: este arquivo.
Resumo
Atualmente, a linguagem trata as cadeias de caracteres interpoladas não textuais e textuais ($"" e $@"" respectivamente) de forma diferente. A principal diferença perceptível para elas é que uma cadeia de caracteres interpolada não textual funciona como uma cadeia de caracteres normal e não pode conter novas linhas em seus segmentos de textos e, em vez disso, deve usar escapes (como \r\n). Por outro lado, uma cadeia de caracteres interpolada textual pode conter novas linhas em seus segmentos de textos (como uma cadeia de caracteres textual) e não evita novas linhas ou outro caractere (exceto por "" para evitar uma citação em si).
Tudo isso é razoável e não mudará com esta proposta.
O que não é razoável atualmente é que estendamos a restrição de "nenhuma nova linha" em uma cadeia de caracteres interpolada não textual além de seus segmentos de textos nas próprias interpolações . Isso significa, entre outras coisas, 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 estar em uma única linha em si" é apenas uma restrição da implementação atual. Essa restrição realmente não é necessária, pode ser irritante e seria bastante simples de remover (consulte o trabalho https://github.com/dotnet/roslyn/pull/54875 para saber como). No final, tudo o que isso faz é forçar o desenvolvedor a colocar as coisas em uma única linha, ou forçá-las em uma cadeia de caracteres interpolada literalmente (ambas as opções podem ser desagradáveis).
As próprias expressões de interpolação não são textos e não devem estar sujeitas a nenhuma regra de escape/nova linha.
Alteração da 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 sobre LDM
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications