![](/img/trans.png)
[英]Strange behavior with NUnit, ExpectedException & yield return
[英]yield return weird behavior
我有以下代碼:
virtual public IEnumerable<string> GetSelectedIds(){
if (_kids == null)
yield return null;
foreach (var current in _kids.Nodes)
yield return current;
}
如果_kids == null
則_kids == null
代碼在_kids.Nodes
崩潰, _kids.Nodes
帶有NullPointerException
我希望如果_kids == null
,則此方法將在前提條件級別返回,但事實並非如此!
題
為什么方法開頭的前提沒有效果?
嘗試這個:
virtual public IEnumerable<string> GetSelectedIds(){
if (_kids == null){
yield return null;
yield break;
}
foreach (var current in _kids.Nodes)
yield return current;
}
更改
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;
}
您的yield return null
幾乎可以肯定不是您想要的-它不會停止迭代的運行(您已經發現),並且您可能始終不想將null字符串返回到集合中。
只需將其替換為產量中斷即可。 這樣,您將獲得一個空集合。
將該foreach
或包裝在if(_kids != null)
,這可能更加清楚。
至於為什么前提條件不會停止執行-這就是yield return
工作的方式-想象一個像這樣的方法:
IEnumerable<String> GetStrings()
{
yield return "MyFirstString";
yield return "MySecondString";
yield return "MyThirdString";
}
這將返回三個字符串的集合-即它不會在第一個yield return
之后停止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.