2013-03-23 21 views
0

我在C#書中找到了這個例子,有人能解釋爲什麼當Fibs方法只需要一個列表時,你可以將Fibs方法傳遞到EvenNumbersOnly方法中?IEnumerable方法

static void Main() 
{ 
    foreach (int fib in EvenNumbersOnly (Fibs(6))) 
     Console.WriteLine (fib); 
} 

static IEnumerable<int> Fibs (int fibCount) 
{ 
    for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) 
    { 
     yield return prevFib; 
     int newFib = prevFib+curFib; 
     prevFib = curFib; 
     curFib = newFib; 
    } 
} 

static IEnumerable<int> EvenNumbersOnly (IEnumerable<int> sequence) 
{ 
    foreach (int x in sequence) 
     if ((x % 2) == 0) { 
     yield return x; 
     }  
} 
+0

由於@alex表示您未通過該方法,而是調用該方法的erturn值。要傳遞該方法,語法如下所示:'foreach(EvenNumbersOnly(Fibs))中的int fib',沒有括號或參數值(6)。並且這是行不通的(正如你所說),因爲'EvenNumbersOnly'不能接受函數委託作爲輸入參數。 – 2013-03-23 15:04:55

+0

好吧,我得到它,另一件事是爲什麼EvenNumbersOnly的foreach調用Fibs,我得到這個調試模式 – user1728706 2013-03-23 15:12:45

+0

,因爲Fibs不是立即返回結果,而只是給出一個一個一個地產生int的代理對象。這是「收益率」的工作原理。 – alex 2013-03-23 15:31:37

回答

3

它期望IEnumerable<int>,作爲參數類型明確指出。你傳遞的是執行方法的結果,而不是方法本身。

0

代碼詮釋Main方法是相同的:

static void Main() 
{ 
    IEnumerable<int> values = Fibs(6); 

    foreach (int fibValue in EvenNumbersOnly(values)) 
     Console.WriteLine (fibValue); 
} 

所以Fibs方法不傳遞給EvenNumbersOnly方法。

相關問題