如何确保迭代器方法不会产生任何空项?

时间:2015-11-07 23:35:09

标签: c# 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)

我可以做些什么向静态检查器证明?

1 个答案:

答案 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的问题,他们仍然没有解决它,我认为他们不会。