2009-11-30 165 views
2

我正在使用Func <>委託添加整數範圍(101,105)。我假設在執行以下操作時獲得101,102,.. 105作爲輸出。但是我得到204,204,..... 什麼出錯?C#Func委託

class MainClass 
    { 
     static List<Func<int>> somevalues = new List<Func<int>>(); 
     static void Main() 
     { 
      foreach (int r in Enumerable.Range(100, 105)) 
      { 
       somevalues.Add(() => r); 
      } 

      ProcessList(somevalues); 
      Console.ReadKey(true); 
     } 

     static void ProcessList(List<Func<int>> someValues) 
     { 
      foreach (Func<int> function in someValues) 
      { 
       Console.WriteLine(function()); 
      } 
     } 

    } 
+1

請參閱http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx – 2009-11-30 18:46:55

+0

此外,這是一個確切的http: //stackoverflow.com/questions/295593/linq-query-built-in-foreach-loop-always-takes-parameter-value-from-last-iteration – 2009-11-30 18:51:15

回答

1

Range方法signiture就像如下:

Range(int start, int count); 

你說「從100開始,給我下105個號碼」。

不是,「從100開始,在105結束」。

3
foreach (int r in Enumerable.Range(100, 105)) 
{ 
    int s = r; 
    somevalues.Add(() => s); 
} 

我想,你需要將外部變量捕獲到一個臨時值來實現輸出,你需要的。我不確定所謂的概念是什麼(捕獲的變量也許)。