.Net匿名方法......奇迹在哪里?

rus*_*der 0 .net lambda

这个函数返回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)

Skr*_*rim 7

在你的代码中,循环变量i对所有函数都是通用的,它将留给它的最后一个值11,稍后将用它来计算总和.

如果更改循环以将变量分配给未共享的作用域中的函数,就像这样......

  for(int i = 1;i <= 10;i++) {
    int n = i;
    functions.Add(() => n * n);
  }
Run Code Online (Sandbox Code Playgroud)

...函数将返回385.


Rex*_*x M 5

因为i循环结束时的值为11.你已经在列表中添加了一堆函数 - 而不是值 - 但函数都指向一个int,显然只能有一个值.它在你的陈述开始时被宣布过一次.与任何变量一样,它的值将是你对它做的最后一件事.当这些函数实际运行时,它们都会针对该值运行.

如果在循环中声明一个新变量,那个变量永远不会改变(永远不会被重新赋值),所以当函数运行时,它仍然会引用一个未触及的值.