考虑这一行:
"{0} Client called server Method: {1}) Returned: {2} Status: {3}.",
session.GetClientInfo(), request, response, status
$"{session.GetClientInfo()} Client called server Method: {request}) Returned: {response} Status: {status}."
事实证明,请求、响应、状态可能包含一对(或者甚至可能是一对,我没有检查过)花括号。在这种情况下,再次重新格式化可能会导致错误。
什么时候会发生这种情况?例如,如果我们有一个这样的函数:
static void outMessage(LogFilter type, LogLevel level, string text, params object[] args)
{
Logger logger = GetLoggerByType(type);
logger.write(new LogMessage(level, type, string.Format(text, args)));
}
如果参数是带有大括号的字符串,其中包含格式无法识别的表达式,例如:
{{ "useBindlessRpc": true, "meteringLevel": "METERING_LEVEL_LEGACY", "clientSdkInfo": { "sdkName": "BGS C++ SDK", "sdkVersion": { "majorVersion": 6, "minorVersion": 2, "patchVersion": 0, "versionString": "6.2.0" }, "protocolVersion": { "majorVersion": 3, "minorVersion": 11, "patchVersion": 10, "versionString": "3.11.10-44dad063b5" } } }}
为什么会有这样的函数存在:
- 可能是在引入插值之前创建的
- 支持这两个选项
- 也许它是为了支持组合选项(这不是一个好主意,因为在这种情况下无法避免错误)
变量中的花括号来自哪里:
- 键盘输入
- 序列化结果
- 从任何其他地方
如果里面有括号,
也可能会出现这个问题:Prior to C# 10, if an interpolated string has the type string, it's typically transformed into a String.Format method call. The compiler may replace String.Format with String.Concat if the analyzed behavior would be equivalent to concatenation.
转义括号有帮助吗? - 我没试过,但 C# 代码禁止转义它们
问: 这种情况该怎么办?
UPD: 在这个平台上,也在这台机器上,不会发生错误。可以假设这个错误取决于“天知道是什么”。我假设它取决于编码。根据错误消息,需要 ASCII,尽管默认值似乎是 UTF16。为什么需要这种编码——我不知道。也许这根本不是一个正确的错误。厌倦了戳调试器。大家有兴趣的话可以自己挖一下。