首页 >后端开发 >C++ >为什么 Lambda 表达式捕获 C# 中迭代​​器变量的最终值?

为什么 Lambda 表达式捕获 C# 中迭代​​器变量的最终值?

Barbara Streisand
Barbara Streisand原创
2024-10-29 11:02:02730浏览

Why Do Lambda Expressions Capture the Final Value of Iterator Variables in C#?

在 C# 中将 Lambda 表达式与迭代器结合使用

在 C# 中,lambda 表达式提供了一种简洁便捷的方式来定义匿名函数。然而,将 lambda 表达式与迭代器结合使用时的一个常见陷阱是捕获的变量不是迭代器变量的当前值,而是最终值。

请考虑以下代码:

<code class="c#">Type[] types = new Type[] { typeof(string), typeof(float), typeof(int) };
List<PrintHelloType> helloMethods = new List<PrintHelloType>();

foreach (var type in types)
{
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
    helloMethods.Add(sayHello);
}

foreach (var helloMethod in helloMethods)
{
    Console.WriteLine(helloMethod("Hi"));
}</code>

当您执行此代码时,您可能期望它打印以下输出:

Hi String
Hi Single
Hi Int32

但是,实际输出是:

Hi Int32
Hi Int32
Hi Int32

这是因为 lambda 表达式捕获循环变量类型,而不是定义 lambda 时的值。因此,当执行 lambda 时,它使用类型的最终值,即 Int32。

要解决此问题并获得所需的输出,可以使用局部变量来捕获迭代器的当前值变量,如以下代码所示:

<code class="c#">foreach (var type in types)
{
    var newType = type;
    var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting));
    helloMethods.Add(sayHello);
}</code>

在这种情况下,lambda 表达式捕获局部变量 newType,该变量被赋予 type 的当前值。这可确保 lambda 表达式在执行时使用正确的类型值。

以上是为什么 Lambda 表达式捕获 C# 中迭代​​器变量的最终值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn