允许所有插值中的新行

注意

本文是特性规范。 此规范是功能的设计文档。 它包括建议的规范变更,以及功能设计和开发过程中所需的信息。 这些文章将持续发布,直至建议的规范变更最终确定并纳入当前的 ECMA 规范。

功能规范与已完成的实现之间可能存在一些差异。 这些差异记录在相关的语言设计会议 (LDM) 说明中。

可以在有关规范的文章中了解更多有关将功能规范子块纳入 C# 语言标准的过程。

支持者问题:https://github.com/dotnet/csharplang/issues/1528

总结

目前的语言对非逐字和逐字内插字符串(分别为 $""$@"")的处理方式不同。 主要 明显的 区别在于,非逐字解释的内插字符串的工作方式与普通字符串相似,在其文本段中不能包含换行符,必须使用转义符(例如 \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