C# में foreach लूप वेरिएबल को लैम्ब्डा द्वारा गलत तरीके से क्यों कैप्चर किया जाता है?
सभी को नमस्ते! मैंने हाल ही में C# सीखना शुरू किया है और `foreach` लूप के अंदर लैम्ब्डा एक्सप्रेशन का उपयोग करते समय एक बहुत ही अजीब व्यवहार का सामना किया।
मेरे पास एक सरल कोड है जहाँ मैं एक्शन की एक सूची बनाता हूँ जो 0 से 4 तक संख्याएँ प्रिंट करनी चाहिए:
```csharp
var actions = new List();
for (int i = 0; i < 5; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action();
}
```
यह कोड आउटपुट देता है: 5, 5, 5, 5, 5। मैं समझता हूँ कि ऐसा इसलिए है क्योंकि वेरिएबल `i` को रेफरेंस द्वारा कैप्चर किया जाता है, और लैम्ब्डा को कॉल करने के समय तक इसका मान 5 हो चुका होता है। यह तार्किक है।
लेकिन जब मैं `foreach` के साथ ऐसा करता हूँ:
```csharp
var actions = new List();
foreach (var i in Enumerable.Range(0, 5))
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action();
}
```
C# के पुराने संस्करणों (5.0 से पहले) में यह कोड भी 5, 5, 5, 5, 5 आउटपुट करता था। लेकिन C# 5.0 से शुरू करके यह 0, 1, 2, 3, 4 आउटपुट करता है।
ऐसा क्यों? आखिरकार, `foreach` में लूप वेरिएबल...