4

考虑以下代码,使用代码协定静态分析编译:

void TestGood<T>(T arg)
{
    Contract.Requires(arg != null);
}

void TestBad<T>(T arg)
{
    Contract.Requires(null != arg);
}

void RunTest()
{
    TestGood(Guid.Empty); // No warnings
    TestBad(Guid.Empty);  // Warning - "CodeContracts: requires unproven: null != arg"
}

看起来二进制==表达式中参数的顺序很重要,这没有多大意义。

它不限于Guid类型。例如,struct MyStruct { }给出相同的行为。

奇怪的是,如果我们传递一个内置的数字类型(例如intvalue 0),就没有警告。

所以问题是:

  1. 有什么理由打电话TestBad给警告吗?
  2. 如果不是,这是代码合同静态分析器中的错误吗?

将代码合同版本 1.5.60502.11 与 Visual Studio 2012 一起使用。这是显示使用的设置的屏幕截图。此外,正如建议的那样,我在代码合同用户论坛中提出了同样的问题。

4

0 回答 0