编程语言
首页 > 编程语言> > c#-代码合同警告有关可能失败的“ Assume”调用

c#-代码合同警告有关可能失败的“ Assume”调用

作者:互联网

在我的一个类中,我有一个ExpandoObject类型的私有字段.该字段是在构造函数中初始化的(this.expected = new ExpandoObject()),因此我相信它永远不会为null.

因此,在此类的一种方法中,我可以放心地添加

Contract.Assumes(this.expected != null)

在将this.expected用于任何对象之前,代码合同将不必担心对空对象的调用.但是,我得到一个警告,而不是警告对空引用的可能方法调用

The dynamically dispatched call to method ‘Assume’ may fail at runtime because one or more applicable overloads are conditional method

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

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

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

在第三行,我收到警告

CodeContracts: Possibly calling a method on a null reference ‘OddEnds.Testing.TestBase.o_SiteContainer0.<>p_Site3.Target’

我认为null引用的奇数签名是因为exp是动态对象.

我该如何解决?

解决方法:

我认为解决问题的最佳方法是声明,期望值永远不会为null,因为它在类上是不变的:

class TheClass {

    ExpandoObject expected;

    ...

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

    ...

}

当您执行此操作时,静态检查器将检查构造函数结尾处的期望值是否不为null,然后它将知道在其他任何方法的开头处期望值都不为null.

标签:code-contracts,c
来源: https://codeday.me/bug/20191102/1994592.html