三个大括号的插值字符串

3

我有一个插值字符串,它以一个参数结尾,后面跟着一个闭合大括号。

需要对其进行格式化处理,但是该字符串将第一个双大括号视为转义的大括号,并将其余的视为用于闭合参数的大括号:

> $"foo:{16:x}"
"foo:10"
> $"foo:{16:x}}}"
"foo:x}"

我应该如何正确编写插值字符串,以便获得foo:10}

2
令人印象深刻的是,如果你尝试将 } 转义为 \u007d,甚至会出现一个特殊的错误消息!显然有人非常喜欢他们的语法。 - Jeroen Mostert
相关. - Sinatr
同样相关。 - Matthew Watson
你是对的@JeroenMostert。错误 CS8087:在插值字符串中,'}'字符只能通过加倍' }} '来转义。这似乎很刻薄。 - BanksySan
1个回答

7
很不幸,这方面没有直接的语法;
$"foo:{16:x}{'}'}" // or $"foo:{16:x}{"}"}"

这是一个有效的技巧;否则,可以简单地连接起来。

就个人而言,关于黑客行为,我宁愿把 } 放在外面:$"foo:{16:x}{null}}}"$"foo:{16:x}{""}}}" 同样可行。但这可能只是一个观点问题。 - user743382
2
@hvd 是的,一旦你开始选择你最喜欢的丑陋黑客技巧,那就是一个糟糕的选择。 - Marc Gravell
这正是我所想的。有趣的是,由于结果不是“FormattableString”,所以连接操作无法起作用。 - BanksySan
@BanksySan,你从未指定它必须是FormattableString :) 编译器积极地不喜欢这样做 - 请参见使用Foo(string x)Foo(FormattableString x)Foo($"test {val}");来了解我的意思。 - Marc Gravell
它不一定是必需的(我的用例需要它),但问题存在于其是否存在。 - BanksySan
@EhsanSajjad,您是指上面的评论吗?如果是:选择Foo(string)而不是Foo(FormattableString) - 这个可以吗? - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接