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); };
}