假阳性:先决条件是多余的
为什么一旦警告级别处于第二级或更高级别,这个小代码示例就会得到以下警告?
public int Foo(int a) { if (a >= 0) throw new ArgumentException("a should be negative", "a"); Contract.EndContractBlock(); return a; }
CodeContracts:build议的要求:这个先决条件是多余的:考虑删除它。 你比较一个结构值为null?
显然,整数可以是负数,所以前提条件很难多余,那么为什么我会得到这个警告呢?
编辑:这是什么ILSpy显示创build的function在看exe时:
public int Foo(int a) { if (a >= 0) { ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null); throw new ArgumentException("a should be negative", "a"); } return a; }
我知道这并不能直接回答你的问题,但是看起来你使用的是代码合同的遗留模式。
本文档根据使用要求描述了推荐的组装模式:
en-us/projects/contracts/userdoc.html
从第20,21 …
文件的另一个片段:
5.1.1组装模式
合同工具需要知道您select哪种使用模式。 如果您使用VisualStudio,请按如下所示在合同属性窗格中select“组合模式”:
- 用法1或2:标准合同要求
- 用法3:自定义参数validation
这可以使工具在违反使用准则时发出适当的警告。 如果使用命令行中的工具,请为-assemblyMode选项传递正确的参数
因此,使用“标准合同要求”组装模式,您可以执行以下任一操作:
Contract.Requires<ArgumentException>(a < 0, "a"); // OR Contract.Requires(a < 0, "a should be negative");
这些都不会对我产生任何警告。
无论如何,我希望这有帮助。
干杯peteski