C# 匿名函数的力参数求值

C# 匿名函数的力参数求值,c#,C#,我想知道是否有简单的方法来强制匿名函数的参数计算?意义重大 用于多线程编程。 比如我写 for(int i=0; i<5; ++i) { Task.Factory.StartNew(() => Console.WriteLine(i)); } 有什么想法吗 谢谢。如果没有编译器或框架支持,我不知道这样的方法是否(合理地)可行。最后,编译器会生成代码来提升变量,而不是在创建委托时提升变量的值,这会导致该行为 基本

我想知道是否有简单的方法来强制匿名函数的参数计算?意义重大

用于多线程编程。 比如我写

        for(int i=0; i<5; ++i)
        {
            Task.Factory.StartNew(() => Console.WriteLine(i));
        }
有什么想法吗


谢谢。

如果没有编译器或框架支持,我不知道这样的方法是否(合理地)可行。最后,编译器会生成代码来提升变量,而不是在创建委托时提升变量的值,这会导致该行为

基本上,您必须在“EvaluteParameters”中“执行”委托才能使其工作。或者,摆弄表达方式可能会有这样的效果

顺便说一句,如果委托是在循环内部创建的,但在循环外部(之后)调用,则这只是一个问题

哦,ReSharper确实有一个警告(尽管它有时是“错误的”或过于迂腐)


无论如何,Jon Skeet在他的书(C#Depth)中确实提到,社区对此确实存在一些困惑,微软正在考虑在未来的版本中改变这种行为(希望我是从记忆中得到的)。如果不破坏依赖于当前行为(或由于当前行为而意外工作)的现有代码,这可能是不可能的。

他们如何获得5、5次?@CodeMonkey:试试看,这是真的。Eric Lippert写到:这就是为什么Java强制您将这些变量声明为“final”,而不一定是5乘以5。您不知道何时执行它,因为这都是由调度程序处理的,您对此几乎没有影响。第一个可以是0到5之间的任何值,第二个可以是1到5之间的值,依此类推。通常是5乘5,因为当前线程可能在新任务开始之前完成循环。谢谢。我还认为实现它的唯一方法是遍历表达式(匿名函数)并正确地计算参数。
        for(int i=0; i<5; ++i)
        {
            var local = i;
            Task.Factory.StartNew(() => Console.WriteLine(local));
        }
    Action EvaluateParameters(Action action)