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!