Autoriser les nouvelles lignes dans toutes les interpolations
Remarque
Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Il inclut les modifications de spécification proposées, ainsi que les informations nécessaires pendant la conception et le développement de la fonctionnalité. Ces articles sont publiés jusqu’à ce que les modifications de spécification proposées soient finalisées et incorporées dans la spécification ECMA actuelle.
Il peut y avoir des différences entre la spécification de la fonctionnalité et l’implémentation terminée. Ces différences sont consignées dans les notes pertinentes de la réunion de conception linguistique (LDM).
Vous pouvez en savoir plus sur le processus d’adoption des speclets de fonctionnalités dans la norme de langage C# dans l’article sur les spécifications .
- [x] Proposé
- [x] Mise en œuvre : https://github.com/dotnet/roslyn/pull/56853
- [x] Spécification : ce fichier.
Résumé
Le langage actuel traite différemment les chaînes interpolées non verbatim et verbatim ($""
et $@""
respectivement). La principale différence significative est qu'une chaîne interpolée non verbatim fonctionne comme une chaîne normale et ne peut pas contenir de nouvelles lignes dans ses segments de texte, et doit à la place utiliser des échappements (comme \r\n
). Inversement, une chaîne interpolée verbatim peut contenir des nouvelles lignes dans ses segments de texte (comme une chaîne verbatim), et n'échappe pas aux nouvelles lignes ou à d'autres caractères (à l'exception de ""
pour échapper à un guillemet lui-même).
Tout cela est raisonnable et ne changera pas avec cette proposition.
Ce qui est déraisonnable aujourd'hui, c'est que nous étendions la restriction « pas de nouvelles lignes » dans une chaîne interpolée non verbatim au-delà de ses segments de texte, dans les interpolations elles-mêmes. Cela signifie, par exemple, que vous ne pouvez pas écrire les éléments suivants :
var v = $"Count is\t: { this.Is.A.Really(long(expr))
.That.I.Should(
be + able)[
to.Wrap()] }.";
En fin de compte, la règle selon laquelle « l’interpolation doit se trouver sur une seule ligne » n'est qu'une restriction de l’implémentation actuelle. Cette restriction n’est vraiment pas nécessaire, peut être ennuyeuse et serait assez triviale à supprimer (voir la tâche https://github.com/dotnet/roslyn/pull/54875 pour voir comment). En fin de compte, tout ce que cela fait, c'est forcer le développeur à placer les choses sur une seule ligne, ou à les forcer dans une chaîne interpolée verbatim (les deux pouvant être désagréables).
Les expressions d'interpolation elles-mêmes ne sont pas du texte et ne devraient pas être soumises à des règles d'échappement ou de remplacement de lignes.
Modification de la spécification
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
;
Discussions sur le LDM
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications