如何让Code Contracts相信变量不为空?

10

我有一些工厂方法

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

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

        return result;
    }

当我尝试构建项目时,出现了以下警告:
CodeContracts: ensures unproven: Contract.Result() != null
我理解IUnityContainer接口没有任何契约,所以Code Contracts认为变量可能为空,并且没有办法证明Create()将返回非空结果。在这种情况下,我该如何让Code Contracts相信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: 断言未被证明

我尝试检查 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;
    }

但我不确定手动抛出异常是个好的解决方案。也许有一些方法只使用Code Contracts就能解决问题?

谢谢。


类似:http://stackoverflow.com/q/6889245/ - H H
2个回答

16

认为你想要使用Contract.Assume

Contract.Assume(result != null);

从文档中获取:

指示代码分析工具假定特定条件为真,即使无法静态证明它总是正确的。

如果您已经适当配置了重写器,这将在执行时仍验证结果。


-1

像这样 if((result ?? 0) == 0){}

为了使其更清晰(易读),您可以定义一个扩展方法。

编辑

@allentracks的答案更精确地回答了您的问题。


就像我对@allentracks答案的回应一样,当“result”不可能为空时,为什么要添加一个空值合并运算符。 - Lukazoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接