1 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
public static IEnumerable<int> Foo()
{
}
第一個(gè)沒有返回(因此是編譯器消息)。這是有道理的——它沒有足夠的上下文來知道該怎么做。應(yīng)該返回null嗎?空枚舉?它不知道 - 所以它不會(huì)讓你編譯。
public static IEnumerable<int> Foo()
{
if(false)
{
yield return 0;
}
}
第二個(gè)確實(shí)有一個(gè)yield return(即使無(wú)法訪問),這給了它足夠的上下文來知道您想要返回一個(gè)可枚舉的(因此它可以設(shè)置必要的狀態(tài)機(jī))?,F(xiàn)在,當(dāng)代碼執(zhí)行時(shí),您實(shí)際上從未命中該yield return行(因此編譯器警告) - 因此調(diào)用者將得到一個(gè)空的可枚舉值。這是預(yù)期的——
如果沒有產(chǎn)量中斷,編譯器會(huì)在函數(shù)末尾假設(shè)有一個(gè)產(chǎn)量中斷(就像普通函數(shù)中的 return; 語(yǔ)句一樣)
考慮到第二個(gè)代碼示例是多么丑陋和不直觀,您可能希望改用:
public static IEnumerable<int> Foo()
{
yield break;
}
由于它可以編譯,因此其意圖更加清晰,并且編譯器不會(huì)抱怨無(wú)法訪問的代碼
- 1 回答
- 0 關(guān)注
- 129 瀏覽
添加回答
舉報(bào)