Megosztás a következőn keresztül:


Új vonalak engedélyezése minden interpolációban

Jegyzet

Ez a cikk egy funkcióspecifikáció. A specifikáció a funkció tervezési dokumentumaként szolgál. Tartalmazza a specifikáció javasolt módosításait, valamint a funkció tervezése és fejlesztése során szükséges információkat. Ezeket a cikkeket mindaddig közzéteszik, amíg a javasolt specifikációmódosításokat nem véglegesítik, és be nem építik a jelenlegi ECMA-specifikációba.

A szolgáltatás specifikációja és a befejezett implementáció között eltérések lehetnek. Ezeket a különbségeket a vonatkozó nyelvi tervezési értekezlet (LDM) megjegyzései rögzítik.

A funkcióspektusok C# nyelvi szabványba való bevezetésének folyamatáról a specifikációkcímű cikkben olvashat bővebben.

Bajnoki probléma: https://github.com/dotnet/csharplang/issues/1528

Összefoglalás

A nyelv ma eltérően kezeli a nem szó szerinti és a szó szerinti interpolált sztringeket ($"" és $@""). Ezek esetében az elsődleges ésszerű különbség az, hogy egy nem szó szerint interpolált sztring úgy működik, mint egy normál sztring, és nem tartalmazhat új vonalakat a szövegszegmenseiben, és ehelyett feloldójeleket kell használnia (például \r\n). Ezzel szemben a szó szerinti interpolált sztringek tartalmazhatnak új sorokat a szövegszegmensekben (mint egy szó szerinti sztring), és nem szökik meg az új sorok vagy más karakterek elől (kivéve ha a ""-t használjuk, hogy magát az idézőjelet helyettesítsük).

Mindez ésszerű, és nem fog változni ezzel a javaslattal.

Ami ma ésszerűtlen, hogy kiterjesztjük a 'nincs új sor' korlátozását egy nem szó szerinti interpolált sztringben túl a szövegszegmenseken az interpolációkra magukra is. Ez például azt jelenti, hogy nem írhat a következőt:

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

Végső soron az "interpolációnak egyetlen sorban kell lennie" szabály csak a jelenlegi végrehajtás korlátozása. Ez a korlátozás valóban nem szükséges, és bosszantó lehet, és meglehetősen triviális lenne eltávolítani (lásd a munka https://github.com/dotnet/roslyn/pull/54875, hogy hogyan). Végül csak arra kényszeríti a fejlesztőt, hogy mindent egy sorba helyezzen, vagy szó szerinti interpolált sztringet használjanak (mindkettő kényelmetlen lehet).

Az interpolációs kifejezések maguk nem szövegesek, és nem vonatkozhatnak rájuk semmilyen escape/újsor szabályok.

Specifikáció módosítása

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
    ;

LDM-vitafórumok

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