C#转义花括号与格式修饰符不兼容?

5
我知道我们可以在C#中使用{{}}来转义花括号,但如果它们紧跟在格式修饰符(如{0:F6})后面,它们似乎运行不稳定。
string str;

// Prints "{3.14}" as expected
str = string.Format("{{{0}}}", 3.14);
Console.WriteLine(str);

// Expected "{3.140000}", found "{F6}"
str = string.Format("{{{0:F6}}}", 3.14);
Console.WriteLine(str);

2
为什么不直接使用 str = "{" + string.Format("{0:F6}", 3.14) + "}"; 呢? - Pikoh
2
@Pikoh 我认为这个问题更多的是关于“这是否是C#中预期的行为”。 - user1666620
@blas3nik的回答解释了原因;另请参阅MSDN中“转义大括号”在“组合格式化”中,其中清楚地解释了这一点;具体来说,“不支持解释嵌套的大括号”。 - gerryLowry
pi =~ 3.14159265... 所以你会想要 3.141593 - gerryLowry
丑陋的代码:str = "{" + string.Format("{0:F6}", 3.14) + "}"; Console.WriteLine(str); - gerryLowry
@user1666620,在C# 5.0语言规范中,只有3个{{实例,因此这不是C#的预期行为~~在“7.6.10.4数组创建表达式”中两次,在“12.6数组初始化程序”中一次;这是.NET Framework的设计考虑,在“.NET Framework应用程序基本知识”中找到了“组合格式化”。 - gerryLowry
2个回答

6
这是C#处理大括号的方式,这是众所周知的。 请看这里 你可以像这样转义它(例如,有不同的方法):
 var str = string.Format("{0}{1:F6}{2}", "{", 3.14, "}");
 Console.WriteLine(str);

谢谢提供链接 - 如果我将来遇到这个问题,这是一个值得记住的东西。如果可以的话,我会给它点赞两次。 - user1666620
你的答案是正确的(+1),但我肯定会称之为微软从未修复的漏洞。 - xxbbcc
@xxbbcc 这不是一个 bug。F6}} 被认为是变量的格式。顺便说一句,如果他们把它变成非贪婪的就更好了 ;) - M.kazem Akhgary
@M.kazemAkhgary 是的,我读了链接的文章,我的意思是实现的贪婪性是错误。 - xxbbcc

1

试试这个:

 String.Format("{0}{1:F6}{2}", "{",3.14, "}") 

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