假阳性:先决条件是多余的

为什么一旦警告级别处于第二级或更高级别,这个小代码示例就会得到以下警告?

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