c# - 为什么在 lambda 表达式中使用迭代变量不好

标签 c# vb.net lambda iteration warnings

我刚刚编写了一些快速代码并注意到了这个编译器错误

Using the iteration variable in a lambda expression may have unexpected results.
Instead, create a local variable within the loop and assign it the value of the iteration variable.

我知道这意味着什么,我可以轻松修复它,没什么大不了的。
但我想知道为什么在 lambda 中使用迭代变量是一个坏主意?
我以后会造成什么问题?

最佳答案

考虑这段代码:

List<Action> actions = new List<Action>();

for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (Action action in actions)
{
    action();
}

您希望打印什么?显而易见的答案是 0...9 - 但实际上它打印了 10、十次。这是因为只有一个变量被所有代表捕获。这种行为是出乎意料的。

编辑:我刚刚看到您正在谈论 VB.NET 而不是 C#。我相信 VB.NET 有更复杂的规则,因为变量在迭代中保持其值的方式。 This post by Jared Parsons提供了有关所涉及困难类型的一些信息 - 尽管是从 2007 年开始的,所以实际行为可能从那时起已经发生了变化。

关于c# - 为什么在 lambda 表达式中使用迭代变量不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/227820/

相关文章:

c# - 在 WinRT 中使用 FlipView 和 DataTemplateSelector 动态显示项目

c# - 具有 void 返回类型的异常和 WCF 服务

mysql - VB.NET 中的自动编号

android - 如何声明与 lambda 一起使用的接口(interface)?

c++ - 标准是否保证了 lambda 的可继承性?

c# - 在 XSD 的枚举中指定值

c# - ASP.NET MVC : How to use linq lambda expression with a ViewModel to get data?

c# - WPF:如何在运行时更改 CurrentUICulture

c# - 如何在出现错误时优雅地退出我的应用程序?

python - 使用 Lambda 函数时出现语法错误