代码合同警告关于可能失败的'假设'呼叫

在我的一个类中,我有一个ExpandoObject类型的私有字段。 该字段在constructior中初始化( this.expected = new ExpandoObject() ),所以我相信它永远不会为null

因此,在这门课的其中一种方法中,我安然无恙地补充说

Contract.Assumes(this.expected != null)

在使用this.expected之前,因此代码合约将不必担心可能的调用空对象。 然而,我没有警告可能的方法调用空引用,我得到一个警告说

由于一个或多个适用的重载是条件方法,因此动态调度方法'Assume'可能会在运行时失败

方法签名和前几行代码如下所示:

protected void Expect(object values)
{
    Contract.Requires<ArgumentNullException>(values != null);

    Contract.Assume(this.expected != null);
    var exp = (ICollection<KeyValuePair<string, object>>)this.expected;

在第三行,我得到了一个警告

CodeContracts:可能调用空引用的方法'OddEnds.Testing.TestBase.o_SiteContainer0。<> p_Site3.Target'

我假设空引用的奇数签名是因为exp是一个动态对象。

我如何解决这些问题?


我认为解决您的问题的最好方法是声明expected永远不会为null,作为类的不变量:

class TheClass {

    ExpandoObject expected;

    ...

    [ContractInvariantMethod]
    void Invariants()
    {
        Contract.Invariant(this.expected != null);
    }

    ...

}

当你这样做的时候,静态检查器会检查你的构造函数末尾的expected是否为空,然后它会知道在任何其他方法开始时expected永远不为null。


我认为下面的代码更改会保持编译器的快乐(如果你肯定在这个演员反正,但为什么使用expandoobject然后......无论如何)

ICollection<KeyValuePair<string, object>> col = this.expected as ICollection<KeyValuePair<string, object>>;
Contract.Assume(col != null);
链接地址: http://www.djcxy.com/p/74407.html

上一篇: Code Contracts warning about possibly failing 'Assume' call

下一篇: Contract Ensures unproven for GUID