CodeContract认为分配的只读字段可以为null

All*_*est 4 .net c# code-contracts

我有这个代码:

public class CodeContractSample
{
    private readonly List<object> _items = new List<object>();

    public IEnumerable<object> Query()
    {
        Contract.Ensures(Contract.Result<IEnumerable<object>>() != null);
        //if (_items == null) throw new Exception();
        return _items;
    }
}
Run Code Online (Sandbox Code Playgroud)

CodeContracts给出了这个警告:

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

如果我取消注释中间行,它就会停止抱怨.但为什么一开始就抱怨?_items永远不应该为null ..?

Pie*_*kel 5

合同不是100%,它理解的内容仍然存在差距.

你是对的:结果没有理由得不到证实.有关此特定问题的详细信息,请参阅http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/f82aa25c-e858-4809-bc21-0a08de260bf1.

目前,您可以使用以下方法解决此问题:

Contract.Assume(_items != null);
Run Code Online (Sandbox Code Playgroud)

您还可以使用契约不变量来实现此目的:

[ContractInvariantMethod]
void Invariants()
{
    Contract.Invariant(_items != null);
}
Run Code Online (Sandbox Code Playgroud)