You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插值字符串中格式大括号后的大括号如何转义?附崩溃问题咨询

嘿,这两个问题都是C#字符串插值里关于大括号转义的典型坑,我来给你掰扯清楚!

问题1:如何在包含格式字符串的大括号之后,对插值字符串中的大括号进行转义?

在C#插值字符串里,要输出字面量的{或},必须用双大括号来转义:{{对应单个{,}}对应单个}。

如果你的场景是先写一个带格式说明的插值表达式(比如{变量名:格式符}),之后要加字面量大括号,只要确保转义的双大括号和插值的边界不混淆就行。举两个实际例子:

  • 想输出:结算金额:{123.45} 元,对应的插值代码是:

    $"结算金额:{{{123.45:N2}}} 元"
    

    这里{{转成{,{123.45:N2}是带格式的插值,}}转成},最终输出就是目标字符串。

  • 想在插值表达式后面加一个字面量{,比如:当前时间:{2024-05-24} {,代码是:

    $"当前时间:{{{DateTime.Now:yyyy-MM-dd}}} {{"
    

    末尾的{{会被解析为单个{,不会和前面的插值大括号冲突。

问题2:关于$"{{{DayOfWeek.Friday:d}}}"崩溃的疑问

为什么程序会崩溃?

这锅得甩给C#插值字符串的左到右解析规则:解析器扫描字符时,会优先把连续的偶数个{/}解析成字面量;如果是奇数个,最后一个就会被当作插值表达式的起始/结束标记。

拿你的代码$"{{{DayOfWeek.Friday:d}}}"来说,解析过程是这样的:

  1. 前两个{被合并成一个字面量{,剩下的第三个{被当作插值表达式的开始。
  2. 解析器找到第一个},把它当作插值表达式的结束(对应第三个{)。
  3. 此时还剩一个},但前面已经没有未闭合的{了,导致大括号不匹配,直接抛出FormatException,程序就崩了。

你加空格后能运行,是因为空格打破了解析器的连续匹配逻辑——它不会把空格后的}和前面插值结束的}当成一组,不过这本质上是“歪打正着”,并不是规范的解决方式。

无空格且正常运行的解决方法

给你两个靠谱的方案:

方案1:明确插值边界,用括号包裹表达式

把插值表达式用括号括起来,让解析器清晰区分插值和转义大括号:

$"{{{(DayOfWeek.Friday):d}}}"

这样解析器会准确识别(DayOfWeek.Friday):d是插值内容,后面的}}就是转义的字面量},最终输出{5}(d格式符会把Friday转成对应的数字5)。

方案2:用string.Format替代插值字符串

如果觉得插值的大括号太绕,直接用传统的string.Format反而更清晰:

string.Format("{{0:d}}", DayOfWeek.Friday)

这里的{{和}}转义成字面量{和},{0:d}是带格式的占位符,效果和插值完全一样,还不会有解析歧义。

另外,如果你就是想用插值字符串,也可以拆分拼接来避免歧义:

$"{{" + $"{DayOfWeek.Friday:d}" + $"}}"

虽然啰嗦一点,但绝对不会出错。


内容的提问来源于stack exchange,提问作者wezten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:53