我注意到在VS2017 IDE中,类似以下内容的行
coroutineScope {
launch { ... }
}
用绿色波浪形下划线突出显示string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
。将鼠标悬停在其上时,将显示警告“格式字符串包含无效的占位符”,表明VS2017的IDE能够验证用于调用诸如string.Format之类的函数的参数。
这很棒,因为在编写格式字符串和参数之间不匹配的代码时,我会立即得到有关该问题的反馈,而不是在运行时过一会儿。但是,如果我用类似于string.Format的原型定义自己的函数,并且内部使用string.Format,则不会进行参数验证。
{4}
只有带有class Example
{
void ThrowException(string format, params object[] args)
{
throw new Exception(string.Format(format, args));
}
void LogMessage(int errorCode, string format, params object[] args)
{
throw new NotImplementedException("No logger!", new Exception(string.Format(format, args)));
}
void Main()
{
string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
ThrowException("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
LogMessage(0, "{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
}
}
的行显示验证错误。这意味着,当调用需要相同验证的自定义函数时,我只会将该问题检测为运行时错误。
我查看了the reference source for string.Format,希望能够复制用于配置IDE验证的属性,但是在那里看不到任何相关内容,并且无法找出合适的搜索词来查找是否已被询问在其他地方(例如google search for the exact error message似乎只能找到产生错误的Roslyn源)
什么控制IDE是否对格式字符串执行这种验证,以及如何为自己的代码(例如示例函数)启用它?