gpt4 book ai didi

c# - 如何让代码契约相信变量不为空?

转载 作者:可可西里 更新时间:2023-11-01 09:04:36 26 4
gpt4 key购买 nike

我有一些工厂方法

    public T Create<T> () where T : class 
{
Contract.Ensures(Contract.Result<T>() != null);

T result = this.unityContainer.Resolve<T>();

return result;
}

我尝试构建项目时收到警告:

CodeContracts:确保未经证实:Contract.Result() != null

我知道 IUnityContainer 接口(interface)没有任何契约,因此代码契约认为变量可能为 null,并且无法证明 Create() 将返回非空结果。

在这种情况下,我如何让代码契约相信 result 变量不为空?

我首先尝试调用 Contract.Assert

    public T Create<T> () where T : class 
{
Contract.Ensures(Contract.Result<T>() != null);

T result = this.unityContainer.Resolve<T>();

Contract.Assert(result != null);

return result;
}

但是我又收到了一个警告:

CodeContracts:断言未经证实

我试过 make check for null 并且这使得所有警告都消失了:

    public T Create<T> () where T : class 
{
Contract.Ensures(Contract.Result<T>() != null);

T result = this.unityContainer.Resolve<T>();

if (result == null)
{
throw new InvalidOperationException();
}

return result;
}

但我不确定这是手动抛出异常的好解决方案。可能有某种方法可以仅使用代码契约来解决问题吗?

谢谢。

最佳答案

认为你想要Contract.Assume :

Contract.Assume(result != null);

来自文档:

Instructs code analysis tools to assume that the specified condition is true, even if it cannot be statically proven to always be true.

如果您正确配置了重写器,这仍然会在执行时验证结果。

关于c# - 如何让代码契约相信变量不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304404/

26 4 0
文章推荐: c# - 为什么 IObservable.First() 会阻塞?
文章推荐: android - 如何在 Android 的 ViewPager 中使用 viewpagerindicator?
文章推荐: c# - 在 C# 中使用 var 和 default 进行声明
文章推荐: android - 如何从 Get Response 中提取特定的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com