[英]Is there a way to Ignore escape characters but still use string interpolation? C#
[英]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} }}");
按預期工作,但有額外的空間。 我可以連接尾部支架,我認為這是一個窮人的解決方案。 有口語富人的解決方案嗎? 謝謝。
這是因為string.Format的行為中的“奇怪”,以及我們希望在生成的格式字符串中插值和插入之間進行精確的1對1映射。 簡而言之,語言行為精確地模擬了string.Format的行為。
在插值(花括號內的東西)中,表達式以冒號(開始格式化字符串)或閉合大括號結束。 在后一種情況下,加倍的大括號沒有特殊含義,因為它不在字符串的文字部分內。 因此,連續的三個花括號將被解釋為接近插值,然后是文字(通過加倍轉義)關閉花括號。 但是在冒號之后,格式字符串被賦予該插值,並且該格式字符串是任何字符串,並且它由緊密的大括號終止。 如果你想在你的格式字符串中使用一個緊密的大括號,你只需要將它加倍。 這是你無意中做的。
CoolBots提供了處理此https://stackoverflow.com/a/42993667/241658的最佳方式
閱讀https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx的“Escaping Braces”部分,以獲得對此問題的解釋。
好奇的解決方法:
var p = price.ToString("C");
Console.Write($"{{Price = {p}}}");
出於某種原因, $"{{Price = {p}}}"
和$"{{Price = {p:C}}}"
具有不同的關聯結果,這感覺就像編譯器錯誤。 我會四處詢問! 請注意, 它與如何一致string.Format
適用相同的規則,所以它可能是故意傳播較早的框架怪胎。
您可以插值而不是連接 - 將其作為字符串文字傳遞:
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空間字符: 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")));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.