首页新闻找找看学习计划

foreach (var foo in actions) { Console.WriteLine(foo()); }

0
[已解决问题] 解决于 2015-01-11 18:59

int[] data = new int[] { 1, 2, 3, 4, 5 };

List<Func<int>> actions = new List<Func<int>>();
IEnumerator e = data.GetEnumerator();
 
int x = 0;
while (e.MoveNext())
{
    x = (int)e.Current;
    actions.Add(() => x);
}
 
foreach (var foo in actions)
{
    Console.WriteLine(foo());

}

运行结果为什么是55555,能不能把第二个foreach改成 while然我看看

博学多思的主页 博学多思 | 初学一级 | 园豆:89
提问于:2015-01-10 16:26
< >
分享
最佳答案
1

这是闭包的一个陷阱  参考 http://www.2cto.com/kf/201405/297249.html javascript也有类似问题

可以使用reflector反编译一下编译好的库,这样就可以知道底层的运作原理了

奖励园豆:5
2012 | 专家六级 |园豆:18923 | 2015-01-10 18:10

2012 引用的文章将的很清楚。

俺不是肥熊猫 | 园豆:18 (初学一级) | 2015-01-10 18:19

使用reflector反编译一下编译好的库,这样就可以知道底层的运作原理了

请问怎么反编译?能不能给我解释一下

博学多思 | 园豆:89 (初学一级) | 2015-01-11 13:07

http://q.cnblogs.com/q/69086/

博学多思 | 园豆:89 (初学一级) | 2015-01-12 19:04
其他回答(2)
0

闭包

jello chen | 园豆:7091 (大侠五级) | 2015-01-10 18:03

如果你不想闭包,请将变量x声明在while循环体内,code 如下:

while (e.MoveNext())
{
    int x = (int)e.Current;
    actions.Add(() => x);
}

 

 

支持(0) 反对(0) jello chen | 园豆:7091 (大侠五级) | 2015-01-10 18:13
0

1L正解

刘宏玺 | 园豆:14004 (专家六级) | 2015-01-10 23:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册