Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,为什么事件表现不同?_C#_Events_Delegates_Ienumerable - Fatal编程技术网

C# 在这种情况下,为什么事件表现不同?

C# 在这种情况下,为什么事件表现不同?,c#,events,delegates,ienumerable,C#,Events,Delegates,Ienumerable,以下程序 static IEnumerable<Action> Create() { foreach (var i in Enumerable.Range(0, 2)) { yield return () => { Console.Write(i); }; } } static void Main(string[] args) { foreach (var func in Create()) { func

以下程序

static IEnumerable<Action> Create()
{
    foreach (var i in Enumerable.Range(0, 2))
    {
        yield return () => { Console.Write(i); };
    }
}

static void Main(string[] args)
{
    foreach (var func in Create())
    {
        func();
    }

    Console.ReadLine();
}
输出

十一,


为什么会这样?如何使程序2输出
01

您正在lambda表达式中捕获循环变量。这意味着当委托最终被调用时,它将使用变量的最新值。。。这将永远是1。试试这个:

foreach (var i in Enumerable.Range(0, 2))
{
    int copy = i;
    SomethingHappened += () => { Console.Write(copy); };
}

。。。然后阅读相关内容。

您正在lambda表达式中捕获循环变量。这意味着当委托最终被调用时,它将使用变量的最新值。。。这将永远是1。试试这个:

foreach (var i in Enumerable.Range(0, 2))
{
    int copy = i;
    SomethingHappened += () => { Console.Write(copy); };
}

。。。然后阅读它。

在第二个程序中,变量
i
被lambda捕获。要获得正确的行为,请在lambda中使用本地副本。例如

foreach (var i in Enumerable.Range(0, 2))
{
    var local = i;
    SomethingHappened += () => { Console.Write(local); };
}

在第二个程序中,lambda捕获变量
i
。要获得正确的行为,请在lambda中使用本地副本。例如

foreach (var i in Enumerable.Range(0, 2))
{
    var local = i;
    SomethingHappened += () => { Console.Write(local); };
}