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