如何使代码契约相信变量不为空

本文关键字:变量 相信 何使 代码 契约 | 更新日期: 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的答案更适合你的问题