当字符串在资源中时,为什么 String.Format 无法转义字符?

Why does String.Format fail to escape characters when the string is in a resource?

var result1 = String.Format("Hello\n\t{0}\n\n", "Bill");
// MyResource.FormatMe contains the same text: Hello\n\t{0}\n\n
var result2 = String.Format(MyResource.FormatMe, "Bill");

结果 1 符合预期:

"Hello
    Bill

"

结果 2 不是:

Hello\n\tBill\n\n

当格式字符串来自资源时,为什么 String.Format 不转义转义字符?

String.Format 不转义任何东西。是编译器将字符串文字中的 \n\t 和其他转义序列处理成其他内容(也就是说,如果您查看编译器生成的二进制文件并搜索您的字符串,您将不会在那里找到文字 \ 字符后跟 n,但实际字节为换行符)。因此,任何在您的代码中不作为字符串文字存在的内容都不会处理转义序列。

您可以轻松地预处理字符串以将 \n\t 更改为实际的换行符和制表符:

string result2_format = MyResource.FormatMe.Replace("\n", "\n").Replace("\t", "\t");