我想知道是否可以确保(使用code-contracts)迭代器方法永远不会产生空项。
这种简化方法:
public static IEnumerable<object> CreateSomeObjects()
{
Contract.Ensures(Contract.Result<IEnumerable<object>>() != null);
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<object>>(), _ => _ != null));
for (int i = 0; i < 10; ++i)
{
yield return new object();
}
}
产生类似于此的编译时警告:
CodeContracts:MyClass.CreateSomeObjects()[0x9]:确保未经证实:Contract.ForAll(Contract.Result&gt;(),_ =&gt; _!= null)
我可以做些什么向静态检查器证明?
答案 0 :(得分:1)
只有将合约放在迭代器上的方法是:
public class Graph
{
public IEnumerable<Node> Nodes(Graph g)
{
Contract.Requires(g != null);
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<Nodei>>, node => node != null));
foreach (var x in g.MethodForGettingNodes())
yield return x;
}
}
上述合同确保调用者不传入null参数,并且方法本身保证 结果集合中的所有元素都是非空的。
目前,静态检查器没有推理集合,因此无法证明 上面的后置条件。
根据文件,他们自2009年以来仍然没有解决它,2年前我遇到了cc的问题,他们仍然没有解决它,我认为他们不会。