允許所有插值處理中的新行
注意
本文是功能規格。 規格可作為功能的設計檔。 其中包含建議的規格變更,以及功能設計和開發期間所需的資訊。 這些文章會發佈,直到提議的規格變更完成並併併入目前的ECMA規格為止。
功能規格與已完成實作之間可能有一些差異。 這些差異被記錄在相關的 語言設計會議(LDM)筆記中。
- [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()] }.";
最後,「插值必須位於單行上」這一規則僅僅是目前實作上的限制。 這種限制實在沒有必要,可能會令人煩惱,其實很容易去掉(請參閱工作 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