如何使代码契约相信变量不为空
本文关键字:变量 相信 何使 代码 契约 | 更新日期: 2023-09-27 18:07:25
我有一些工厂方法
public T Create<T> () where T : class
{
Contract.Ensures(Contract.Result<T>() != null);
T result = this.unityContainer.Resolve<T>();
return result;
}
当我尝试构建项目时,我得到警告:
CodeContracts: ensure unproven: Contract.Result() != null
我理解IUnityContainer接口没有任何合同,所以代码合同认为变量可能为空,没有办法证明Create()将返回非空结果。
在这种情况下,我如何使代码契约相信结果变量不为空?
我先试着打电话给Contract。维护
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: assert unproven
我尝试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);
From the docs:
指示代码分析工具假设指定的条件为真,即使不能静态地证明它总是为真。
如果您正确配置了重写器,那么在执行时仍然会验证结果。
Like if((result ?? 0) == 0){}
为了更清晰(可读),你可以定义一个扩展方法。
编辑
@allentracks的答案更适合你的问题