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

时间:2011-01-31 14:29:39

标签: c# .net 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;
    }
}

CodeContracts给出了这个警告:

  

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

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

4 个答案:

答案 0 :(得分:5)

合同不是100%,它理解的内容仍有差距。

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

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

Contract.Assume(_items != null);

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

[ContractInvariantMethod]
void Invariants()
{
    Contract.Invariant(_items != null);
}

答案 1 :(得分:0)

为什么你认为项目永远不会为空?您可以在该类中使用另一个方法将其设置为null ...

答案 2 :(得分:0)

其实我可以想象这个:

CodeContractSample s = new CodeContractSample();
s.GetType().GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(s, null);
var q = s.Query();

您的想法是什么?

答案 3 :(得分:-1)

Contract.Ensures行承诺该方法永远不会返回null。但是代码中没有任何内容可以防止这种情况发生,直到您取消注释该行。