我知道,有匿名函數,局部堆棧變量都提升到一個類饒人,現在都在堆等,所以下面不工作:匿名函數的局部變量吊裝的方式
using System;
using System.Collections.Generic;
using System.Linq;
namespace AnonymousFuncTest
{
class Program
{
static void Main(string[] args)
{
foreach (var f in GetFuncs())
{
Console.WriteLine(f());
}
Console.ReadLine();
}
static IEnumerable<Func<int>> GetFuncs()
{
List<Func<int>> list = new List<Func<int>>();
foreach(var i in Enumerable.Range(1, 20))
{
list.Add(delegate() { return i; });
}
return list;
}
}
}
我知道改變GetFuncs到這會工作:
static IEnumerable<Func<int>> GetFuncs()
{
foreach(var i in Enumerable.Range(1, 20))
{
yield return() => i;
}
}
不得不說我在做類似如下:
foreach (var arg in someArgList)
{
var item = new ToolStripMenuItem(arg.ToString());
ritem.Click += delegate(object sender, EventArgs e)
{
new Form(arg).Show();
};
mainMenu.DropDownItems.Add(ritem);
}
這當然沒有預期的效果。我知道它爲什麼不起作用,只需要建議如何解決它就可以了。
這個問題,關閉捕捉的foreach的單迭代變量,而不是通過循環每次拍攝不同的變量,是最常見的頭號「這個代碼不能像我期望的那樣」出現我們得到的錯誤報告。我們正在考慮在未來版本的語言中採取突破性變化,並將迭代變量在邏輯上移入循環中。如果有人知道現實世界的代碼會因爲這種變化而中斷,請發郵件給我。我的博客上有一個「聯繫我」鏈接。謝謝! – 2009-07-14 21:56:22