Home  >  Article  >  Backend Development  >  Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-31 08:43:02606browse

Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?

Unexpected Behavior in Lambda Expressions Using Iterator Variable

In the given code, the expected output when calling myClass.Execute() is "Hi String", "Hi Single", "Hi Int32." However, the code prints "Hi Int32" three times. Why is this unexpected behavior occurring and how can it be corrected?

The issue lies in the lambda expression used within the foreach loop:

var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));

In this code, the loop variable type is captured by the lambda expression. However, what is captured is not the value of type at the specific iteration, but the reference to the variable itself.

Therefore, when the PrintHelloType delegate is invoked later, it uses the value of type at the end of the loop, which is "Int32." This results in the unexpected output.

Solution:

To achieve the desired goal, a new variable can be used to capture the value of type during each iteration:

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

Now each lambda expression captures the value of newType, which is the correct value for the specific iteration. The expected output is then produced: "Hi String", "Hi Single", "Hi Int32."

The above is the detailed content of Why does a lambda expression capture the final value of an iterator variable instead of its value during each iteration in a foreach loop?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn