我有这段代码:
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 ..?
答案 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。但是代码中没有任何内容可以防止这种情况发生,直到您取消注释该行。