TL; DR - Добавьте символ условной компиляции CONTRACTS_FULL
в ваш проект.
Метод Contract.Requires(...)
пуст и отключен, если только вы не включите и не используете переписыватель Code Contacts. Запустив программу перезаписи вручную или (обычно) включив ее через свойства проекта Visual Studio, вы сохраните код Contract.Requires(...)
в скомпилированных и переписанных двоичных файлах. Вы знаете, что код будет работать, и, игнорируя предупреждение Resharper, вы можете запустить его и протестировать.
В чем проблема тогда? Решарпер не знает, что контракты кода выполняются, так как они действительно вводятся только во время (после) компиляции. По мнению Resharper, он отключен так же, как работает символ препроцессора DEBUG
и как Visual Studio выделяет области вашего кода, которые не будут частью ваших скомпилированных двоичных файлов.
#ifdef DEBUG
Console.WriteLine("I'm in DEBUG mode, so this is probably a Debug build.");
#else
Console.WriteLine("Let's assume this is a Release build.");
#endif
В соответствии с руководством пользователя Code Contracts (глава 2, первый абзац) и исходным кодом в ContractExtensions.cs
(входит в папку установки Code Contracts), CONTRACTS_FULL
необходимо установить перед компиляцией с этим. Методы Контракта фактически реализуются с [ConditionalAttribute("CONTRACTS_FULL")]
и игнорируются (не включены во время компиляции), если флаг не установлен. Resharper уважает этот флаг и предполагает, что функция не будет работать, если она не установлена.
[ConditionalAttribute("CONTRACTS_FULL")]
public static void Requires(bool condition) { ... }
Решение: Добавьте символ условной компиляции CONTRACTS_FULL
в ваш проект. См. Использование кодовых контрактов Visual Studio и Resharper от Henning Krause.
http://www.infinitec.de/image.axd?picture=Windows-Live-Writer/Using-CodeContracts-with-Resharper/05970F39/ConditionalSymbol.png
Команда Resharper была уведомлена; Анализ кода не учитывает настройки на вкладке свойств проекта «Контракты кода» , Поддержка контрактов кода Microsoft .