手記
この記事は機能仕様です。 仕様は、機能の設計ドキュメントとして機能します。 これには、提案された仕様の変更と、機能の設計と開発時に必要な情報が含まれます。 これらの記事は、提案された仕様の変更が最終決定され、現在の ECMA 仕様に組み込まれるまで公開されます。
機能の仕様と完成した実装の間には、いくつかの違いがある可能性があります。 これらの違いは、関連する 言語設計会議 (LDM) ノートでキャプチャされます。
機能仕様を C# 言語標準に導入するプロセスの詳細については、仕様に関する記事を参照してください。
チャンピオン号: https://github.com/dotnet/csharplang/issues/1528
- [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