这个函数返回1210而不是385,为什么?
public int CalcSquaresSum() {
int sumOfSquares = 0;
List<Func<int>> functions = new List<Func<int>>();
for (int i = 1; i <= 10; i++) {
functions.Add(() => i * i);
}
foreach (var function in functions) {
sumOfSquares += function(); // why function() is always 121
}
return sumOfSquares;
}
Run Code Online (Sandbox Code Playgroud)
在你的代码中,循环变量i对所有函数都是通用的,它将留给它的最后一个值11,稍后将用它来计算总和.
如果更改循环以将变量分配给未共享的作用域中的函数,就像这样......
for(int i = 1;i <= 10;i++) {
int n = i;
functions.Add(() => n * n);
}
Run Code Online (Sandbox Code Playgroud)
...函数将返回385.
因为i循环结束时的值为11.你已经在列表中添加了一堆函数 - 而不是值 - 但函数都指向一个int,显然只能有一个值.它在你的陈述开始时被宣布过一次.与任何变量一样,它的值将是你对它做的最后一件事.当这些函数实际运行时,它们都会针对该值运行.
如果在循环中声明一个新变量,那个变量永远不会改变(永远不会被重新赋值),所以当函数运行时,它仍然会引用一个未触及的值.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |