すべての補間で改行を許可する
手記
この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と完成した実装の間には、いくつかの違いがある可能性があります。 これらの違いは、関連する 言語設計会議 (LDM) ノートでキャプチャされます。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
- [x] 提案済み
- [x]実装: https://github.com/dotnet/roslyn/pull/56853
- [x] 仕様: このファイル。
概要
現在の言語では、非逐語的および逐語的な補間文字列 (それぞれ$""
と $@""
) が異なる方法で扱われます。 これらの主な実用的な違いは、非逐語的な補間された文字列は通常の文字列のように機能し、テキスト セグメントに改行を含めることができず、代わりにエスケープ (\r\n
など) を使用する必要があるということです。 逆に、逐語的な補間された文字列では、テキスト セグメント (逐語文字列など) に改行を含めることができ、改行やその他の文字をエスケープしません (引用符自体をエスケープする ""
を除く)。
これはすべて妥当であり、この提案では変わりません。
現時点で不合理なのは、非逐語的な補間された文字列における「改行禁止」の制限を、テキスト セグメントを超えて補間自体にまで拡張していることです。 これは、たとえば、次の内容を記述できないことを意味します。
var v = $"Count is\t: { this.Is.A.Really(long(expr))
.That.I.Should(
be + able)[
to.Wrap()] }.";
最終的には、"補間は 1 行に記述する必要があります" というルールは、現在の実装の制限にすぎません。 この制限は本当に必要ではなく、迷惑な場合があり、削除するのは非常に簡単です (方法については、作業 https://github.com/dotnet/roslyn/pull/54875 を参照してください)。 最終的には、開発者がコードを1行にまとめるか、そのままの補間された文字列に強制されます (どちらも好ましくないかもしれません)。
補間式自体はテキストではなく、エスケープや改行のルールに拘束されるべきではありません。
仕様の変更
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 ディスカッション
https://github.com/dotnet/csharplang/blob/main/meetings/2021/LDM-2021-09-20.md
C# feature specifications