考虑以下代码,使用代码契约静态分析编译:
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
值0
),则没有警告。
所以问题是:
TestBad
发出警告? 在Visual Studio 2012中使用代码合同版本1.5.60502.11。这是a screenshot showing the settings used。另外,正如我所建议的那样,我在code contracts user forum中提出了同样的问题。