转义字符关联性 C#6 字符串插值
Escape Character Associativity C# 6 String Interpolation
鉴于:
double price = 5.05;
Console.Write($"{{Price = {price:C}}}");
和所需的输出:{Price = $5.05}
有没有办法将最后两个大括号关联为转义的“}”,以便插值按预期工作?就目前而言,前两个被转义(我假设?),输出为:{Price = C}
Console.Write($"{{Price = {price:C} }}");
按预期工作,但有额外的 space。我可以连接尾部支撑,我认为这是一个穷人的解决方案。有没有口语化的富翁解法?谢谢
您可以插入而不是连接 - 将其作为字符串文字传递:
double price = 5.05;
Console.Write($"{{Price = {price:C}{"}"}");
好吧,你可以尝试使用较少使用的转义字符。也许 \b 会起作用,因为它不打印任何东西,而且它在很长一段时间内没有任何功能。类似于:
double price = 5.05;
Console.Write($"{{Price = {price:C}\b}}");
如果这对您不起作用,您可以尝试使用特殊的 UNICODE 字符,例如 U+200B 或 U+FEFF:
double price = 5.05;
Console.Write($"{{Price = {price:C}\x8203}}");
转义字符:https://blogs.msdn.microsoft.com/csharpfaq/2004/03/12/what-character-escape-sequences-are-available/
UNICODE space 个字符:https://www.cs.tut.fi/~jkorpela/chars/spaces.html
当 C# 6 语法出现问题时,为什么不使用传统的 string.Format() 来代替?
double price = 5.05;
Console.WriteLine(string.Format("{{Price = {0}}}", price.ToString("C")));
奇怪的解决方法:
var p = price.ToString("C");
Console.Write($"{{Price = {p}}}");
出于某种原因,$"{{Price = {p}}}"
和 $"{{Price = {p:C}}}"
具有 不同的 关联性结果,感觉像是编译器错误。我四处打听!请注意,它 是 与 string.Format
应用相同规则的方式一致,因此它可能是故意传播早期框架的怪异之处。
这是因为 string.Format 行为中的 "oddity" 以及我们希望在生成的格式字符串中的插值和插入之间具有精确的一对一映射。简而言之,语言行为精确地模拟了 string.Format.
的行为
在插值(花括号内的东西)中,表达式以冒号(格式字符串开始)或右花括号结束。在后一种情况下,双花括号没有特殊含义,因为它不在字符串的文字部分内。因此,连续的三个花括号将被解释为接近插值,后跟一个文字(通过加倍转义)关闭花括号。但是在冒号之后,为该插值给出了格式字符串,并且该格式字符串是任何字符串,并且它以一个大括号结束。如果你想在你的格式字符串中使用一个大括号,你只需将它加倍即可。这是你无意中做的。
CoolBots 给出了处理此问题的最佳方法
请阅读 https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx 的 "Escaping Braces" 部分以了解对这个问题的准确解释。
鉴于:
double price = 5.05;
Console.Write($"{{Price = {price:C}}}");
和所需的输出:{Price = $5.05}
有没有办法将最后两个大括号关联为转义的“}”,以便插值按预期工作?就目前而言,前两个被转义(我假设?),输出为:{Price = C}
Console.Write($"{{Price = {price:C} }}");
按预期工作,但有额外的 space。我可以连接尾部支撑,我认为这是一个穷人的解决方案。有没有口语化的富翁解法?谢谢
您可以插入而不是连接 - 将其作为字符串文字传递:
double price = 5.05;
Console.Write($"{{Price = {price:C}{"}"}");
好吧,你可以尝试使用较少使用的转义字符。也许 \b 会起作用,因为它不打印任何东西,而且它在很长一段时间内没有任何功能。类似于:
double price = 5.05;
Console.Write($"{{Price = {price:C}\b}}");
如果这对您不起作用,您可以尝试使用特殊的 UNICODE 字符,例如 U+200B 或 U+FEFF:
double price = 5.05;
Console.Write($"{{Price = {price:C}\x8203}}");
转义字符:https://blogs.msdn.microsoft.com/csharpfaq/2004/03/12/what-character-escape-sequences-are-available/
UNICODE space 个字符:https://www.cs.tut.fi/~jkorpela/chars/spaces.html
当 C# 6 语法出现问题时,为什么不使用传统的 string.Format() 来代替?
double price = 5.05;
Console.WriteLine(string.Format("{{Price = {0}}}", price.ToString("C")));
奇怪的解决方法:
var p = price.ToString("C");
Console.Write($"{{Price = {p}}}");
出于某种原因,$"{{Price = {p}}}"
和 $"{{Price = {p:C}}}"
具有 不同的 关联性结果,感觉像是编译器错误。我四处打听!请注意,它 是 与 string.Format
应用相同规则的方式一致,因此它可能是故意传播早期框架的怪异之处。
这是因为 string.Format 行为中的 "oddity" 以及我们希望在生成的格式字符串中的插值和插入之间具有精确的一对一映射。简而言之,语言行为精确地模拟了 string.Format.
的行为在插值(花括号内的东西)中,表达式以冒号(格式字符串开始)或右花括号结束。在后一种情况下,双花括号没有特殊含义,因为它不在字符串的文字部分内。因此,连续的三个花括号将被解释为接近插值,后跟一个文字(通过加倍转义)关闭花括号。但是在冒号之后,为该插值给出了格式字符串,并且该格式字符串是任何字符串,并且它以一个大括号结束。如果你想在你的格式字符串中使用一个大括号,你只需将它加倍即可。这是你无意中做的。
CoolBots 给出了处理此问题的最佳方法
请阅读 https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx 的 "Escaping Braces" 部分以了解对这个问题的准确解释。