共用方式為


允許所有插值處理中的新行

注意

本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。

功能規格與已完成實作之間可能有一些差異。 這些差異被記錄在相關的 語言設計會議(LDM)筆記中。

您可以在 規格一文中深入瞭解將功能規範納入 C# 語言標準的過程

總結

今天的語言會區別對待非逐字和逐字插入字串(分別為$""$@"")。 主要的 合理 差異在於,非逐字填入字串的運作方式像一般字串,不能在其文字區段中包含換行符,必須改用跳脫符號(例如 \r\n)。 相反地,逐字插入字串可以在其文字區段中包含換行符(例如逐字字串),而且不會逸出換行符或其他字元(除了 "" 逸出引號本身除外)。

這一切都是合理的,並且不會因為這項提案而改變。

今天不合理的是,我們將非逐字插入 字串中的「沒有換行符」的限制延伸到 本身 其文字片段 到 插補。 例如,這表示您無法撰寫下列內容:

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

最後,「插值必須位於單行上」這一規則僅僅是目前實作上的限制。 這種限制實在沒有必要,可能會令人煩惱,其實很容易去掉(請參閱工作 https://github.com/dotnet/roslyn/pull/54875 說明如何進行)。 最後,它所做的一切都是強制開發人員將專案放在單一行上,或將它們強制成逐字插補字串(這兩者都可能令人不快)。

插值運算式本身不是文字,也不應該受任何轉義/換行規則的約束。

規格變更

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