代码合同警告关于可能失败的'假设'呼叫
在我的一个类中,我有一个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