我有以下代码:
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
,但它没有!
问题
为什么方法开头的前置条件没有效果?
答案 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
之后停止。