考虑以下代码,使用代码协定静态分析编译:
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 { }
给出相同的行为。
奇怪的是,如果我们传递一个内置的数字类型(例如int
value 0
),就没有警告。
所以问题是:
- 有什么理由打电话
TestBad
给警告吗? - 如果不是,这是代码合同静态分析器中的错误吗?
将代码合同版本 1.5.60502.11 与 Visual Studio 2012 一起使用。这是显示使用的设置的屏幕截图。此外,正如建议的那样,我在代码合同用户论坛中提出了同样的问题。