gpt4 book ai didi

c# - 关于可能失败的 'Assume' 调用的代码契约(Contract)警告

转载 作者:行者123 更新时间:2023-11-30 15:45:27 32 4
gpt4 key购买 nike

在我的一个类中,我有一个 ExpandoObject 类型的私有(private)字段。该字段在构造函数中初始化 (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'

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

我该如何解决这些问题?

最佳答案

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

class TheClass {

ExpandoObject expected;

...

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

...

}

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

关于c# - 关于可能失败的 'Assume' 调用的代码契约(Contract)警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200631/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com