Compartir a través de


Permitir nuevas líneas en todas las interpolaciones

Nota

Este artículo es una especificación de características. La especificación actúa como documento de diseño de la característica. Incluye cambios de especificación propuestos, junto con la información necesaria durante el diseño y el desarrollo de la característica. Estos artículos se publican hasta que se finalizan los cambios de especificación propuestos e se incorporan en la especificación ECMA actual.

Puede haber algunas discrepancias entre la especificación de características y la implementación completada. Esas diferencias se recogen en las notas de la reunión de diseño de lenguaje (LDM) correspondientes.

Puede obtener más información sobre el proceso de adopción de especificaciones de características en el estándar del lenguaje C# en el artículo sobre las especificaciones de .

Resumen

En la actualidad, el lenguaje trata las cadenas interpoladas no literales y literales ($"" y $@"" respectivamente) de forma diferente. El principal diferencia sensible para esto es que una cadena interpolada no literal funciona como una cadena normal y no puede contener nuevas líneas en sus segmentos de texto, y en su lugar, debe usar escapes (como \r\n). Por el contrario, una cadena interpolada textualmente puede contener nuevas líneas en sus segmentos de texto (como una cadena textual) y no escapa de nuevas líneas u otro carácter (excepto "" para escapar una comilla propiamente dicha).

Esto es razonable y no cambiará con esta propuesta.

Lo que es irrazonable hoy es que ampliamos la restricción de "sin nuevas líneas" en una cadena interpolada no literal más allá de sus segmentos de texto en las propias interpolaciones. Esto significa, por ejemplo, que no puede escribir lo siguiente:

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

En última instancia, la regla "interpolación debe estar en una sola línea" es simplemente una restricción de la implementación actual. Esa restricción realmente no es necesaria, y puede ser molesta, y sería bastante trivial para eliminar (vea el trabajo https://github.com/dotnet/roslyn/pull/54875 para mostrar cómo). Al final, todo lo que hace es forzar al desarrollador a colocar las cosas en una sola línea, o forzarlas en una cadena interpolada literal (ambas pueden ser inapetecibles).

Las propias expresiones de interpolación no son texto y no deben obedecer a ninguna regla de escape o de nueva línea allí.

Cambio de especificación

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
    ;

Debates LDM

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