Я заметил, что в IDE VS2017 строка, подобная следующей
string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
, имеет {4}
, выделенный зеленым волнистым подчеркиванием.При наведении на него отображается предупреждение «Формат строки содержит недопустимый заполнитель», указывающее, что среда IDE для VS2017 способна проверять параметры для вызова функций, таких как string.Format.
Это здорово, потому чтоЯ получаю немедленный отзыв о проблеме, пока пишу код с несоответствием между строкой формата и аргументами, а не через некоторое время во время выполнения.Однако, если я определяю свои собственные функции с аналогичными прототипами для string.Format и использующими string.Format для внутреннего использования, проверка параметров не выполняется.
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);
}
}
Только строка с string.Format
показывает ошибку проверки.Это означает, что при вызове моих пользовательских функций, требующих такой же проверки, я обнаруживаю проблему только как ошибку времени выполнения.
Я посмотрел на источник ссылки для строки. Формат , надеясь получитьсмог скопировать атрибут, который конфигурирует валидацию IDE, но не увидел там ничего релевантного, и не смог найти хорошие условия поиска, чтобы найти, если это было задано где-то в другом месте (например, поиск в Google для точного сообщения об ошибке казалось, только нашел источник Roslyn, который генерирует ошибку)
Что контролирует, выполняет ли IDE проверки такого типа в строке формата, и как бы я включил ее для своего собственного кода, такого как примеры функций