屈服回归奇怪的行为

时间:2013-11-26 10:43:20

标签: c# ienumerable yield yield-return

我有以下代码:

virtual public IEnumerable<string> GetSelectedIds(){
   if (_kids == null)
        yield return null;
   foreach (var current in _kids.Nodes)
        yield return current;
}

如果_kids.Nodes

,这段代码会在NullPointerException时崩溃_kids == null

我希望这个方法在前提条件级别返回_kids == null,但它没有!

问题

为什么方法开头的前置条件没有效果?

3 个答案:

答案 0 :(得分:7)

试试这个:

virtual public IEnumerable<string> GetSelectedIds(){
   if (_kids == null){
      yield return null;
      yield break;
   }
   foreach (var current in _kids.Nodes)
      yield return current;
}

答案 1 :(得分:5)

更改

if (_kids == null)
        yield return null;

if (_kids == null)
        yield break;

这将返回一个空序列,用户不必检查返回值。

或者你可以改写为

public IEnumerable<string> GetSelectedIds(){
   if (_kids == null)
        return null;

   return GetSelectedIds2();
}

private IEnumerable<string> GetSelectedIds2()
{
    foreach (var current in _kids.Nodes)
        yield return current;
}

答案 2 :(得分:1)

您的yield return null几乎肯定不是您想要的 - 它不会停止迭代运行(如您所见),并且您可能不希望无论如何都要将空字符串返回到集合中。

只需用yield break替换它。这样你就会得到一个空集合。

foreach包裹在if(_kids != null)中,这可能会更清晰。

至于为什么前置条件不会停止执行 - 这就是yield return的工作方式 - 想象一下这样的方法:

IEnumerable<String> GetStrings()
{
   yield return "MyFirstString";
   yield return "MySecondString";
   yield return "MyThirdString";
}

这将返回三个字符串的集合 - 即它不会在第一个yield return之后停止。