误报:前提是多余的

Voo*_*Voo 37 .net c# static-analysis code-contracts visual-studio-2013

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

代码合同设置

pet*_*ski 2

我知道这并不能直接回答您的问题,但看来您正在使用代码合同的旧模式。

本文档介绍了根据使用需求推荐的组装方式:

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

从第 20、21 页开始...

装配模式使用指南

该文档的另一个片段:

5.1.1 组装模式

合约工具需要知道你选择哪种使用模式。如果您使用 VisualStudio,请在合约属性窗格中选择 Assemby Mode,如下所示:

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

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

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

Contract.Requires<ArgumentException>(a < 0, "a");
// OR
Contract.Requires(a < 0, "a should be negative");
Run Code Online (Sandbox Code Playgroud)

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

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

干杯佩特斯基