误报:前提是多余的

时间:2015-06-18 12:00:40

标签: c# .net visual-studio-2013 static-analysis code-contracts

一旦警告级别达到第二级或更高级别,为什么我会为这个简单的代码示例收到以下警告?

public int Foo(int a)
{
    if (a >= 0) throw new ArgumentException("a should be negative", "a");
    Contract.EndContractBlock();
    return a;
}
  

CodeContracts:建议要求:此前提条件是多余的:   考虑删除它。您是否将结构值与null进行比较?

显然,一个整数可以是负数,所以前提几乎不是多余的,为什么我会收到这个警告?

编辑:这是ILSpy在查看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;
}

Code Contracts settings

1 个答案:

答案 0 :(得分:2)

我知道这并没有直接回答您的问题,但似乎您正在使用传统模式进行代码合同。

本文档根据使用要求描述了推荐的装配模式:

http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf

来自第20页,第21页......

assembly mode usage guidelines

该文件的另一个片段:

  

5.1.1装配模式

     

合同工具需要知道您选择的使用模式。如果使用VisualStudio,请在合同属性窗格中选择“装配模式”,如下所示:

     
      
  • 用法1或2:标准合同要求
  •   
  • 用法3:自定义参数验证
  •   
     

这允许工具在违反使用准则时发出适当的警告。如果您使用这些工具   从命令行传递-assemblyMode选项的正确参数

因此,使用“标准合同要求”装配模式,您可以执行以下任一操作:

Contract.Requires<ArgumentException>(a < 0, "a");
// OR
Contract.Requires(a < 0, "a should be negative");

这些都不会对我产生任何警告。

我希望无论如何这都会有所帮助。

干杯 peteski