Udostępnij za pośrednictwem


Zezwalaj na nowe wiersze we wszystkich interpolacjach

Notatka

Ten artykuł jest specyfikacją funkcji. Specyfikacja służy jako dokument projektowy dla funkcji. Zawiera proponowane zmiany specyfikacji wraz z informacjami wymaganymi podczas projektowania i opracowywania funkcji. Te artykuły są publikowane do momentu sfinalizowania proponowanych zmian specyfikacji i włączenia ich do obecnej specyfikacji ECMA.

Mogą wystąpić pewne rozbieżności między specyfikacją funkcji a ukończoną implementacją. Te różnice są przechwytywane w odpowiednich spotkania projektowego języka (LDM).

Więcej informacji na temat procesu wdrażania specyfikacji funkcji można znaleźć w standardzie języka C# w artykule dotyczącym specyfikacji .

Streszczenie

Język obecnie traktuje ciągi niedosłowne i dosłowne interpolowane (odpowiednio$"" i $@""). Podstawową rozsądną różnicą jest to, że ciąg interpolowany niesłowny działa jak zwykły ciąg i nie może zawierać nowych linii w segmentach tekstu i zamiast tego musi używać ucieczki (na przykład \r\n). Z drugiej strony ciąg interpolowany dosłownie może zawierać nowe linie w segmentach tekstu (na przykład ciąg dosłowny) i nie uciekają od nowego wiersza ani innego znaku (z wyjątkiem "" ucieczki samego cudzysłowu).

To wszystko jest rozsądne i nie zmieni się wraz z tym wnioskiem.

To, co jest nierozsądne dzisiaj, polega na rozszerzeniu ograniczenia "brak nowych linii" w ciągu niesłownym interpolowanym poza segmentów tekstu do interpolacji siebie. Oznacza to na przykład, że nie można napisać następujących:

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

Ostatecznie reguła "interpolacja musi znajdować się w jednej linii" jest tylko ograniczeniem bieżącej implementacji. To ograniczenie naprawdę nie jest konieczne, może być irytujące, a jego usunięcie byłoby dość proste (zobacz pracę https://github.com/dotnet/roslyn/pull/54875, aby zobaczyć, jak to zrobić). W końcu wszystko, co robi, to zmusza dewelopera do umieszczenia rzeczy w jednej linii lub zmusza ich do użycia interpolowanego ciągu dosłownego (oba mogą być niewłaściwe).

Wyrażenia interpolacji same w sobie nie są tekstem i nie powinny podlegać żadnym regułom dotyczącym znaków ucieczki ani nowym liniom.

Zmiana specyfikacji

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
    ;

Dyskusje na temat LDM

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