第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么使用yield return 的這段代碼可以編譯?

為什么使用yield return 的這段代碼可以編譯?

C#
江戶川亂折騰 2023-07-09 15:01:36
正如您所料,此代碼會(huì)產(chǎn)生編譯器錯(cuò)誤:public static IEnumerable<int> Foo(){}并非所有代碼路徑都會(huì)返回值但是,編譯時(shí)僅顯示有關(guān)無(wú)法訪問代碼的警告:public static IEnumerable<int> Foo(){    if(false)    {        yield return 0;    }}這會(huì)產(chǎn)生一個(gè)空的枚舉。為什么這會(huì)起作用?它是定義的行為嗎?
查看完整描述

1 回答

?
慕運(yùn)維8079593

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ú)法訪問的代碼


查看完整回答
反對(duì) 回復(fù) 2023-07-09
  • 1 回答
  • 0 關(guān)注
  • 129 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)