簡體   English   中英

轉義字符關聯性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} }}");

按預期工作,但有額外的空間。 我可以連接尾部支架,我認為這是一個窮人的解決方案。 有口語富人的解決方案嗎? 謝謝。

這是因為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-c​​haracter-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM