Home > Backend Development > C++ > body text

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
Release: 2024-10-31 08:43:02
Original
614 people have browsed it

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));
Copy after login

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);
}
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!