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 .
- [x] Proponowane
- [x] Implementacja: https://github.com/dotnet/roslyn/pull/56853
- [x] Specyfikacja: ten plik.
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
C# feature specifications