Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 .
Problem z czempionem: https://github.com/dotnet/csharplang/issues/1528
- [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