Avatar ·

لماذا يتم التقاط متغير حلقة foreach في C# بواسطة المرجع في تعبير lambda؟

مرحبًا بالجميع! أنا مطور C# مبتدئ وواجهت سلوكًا غريبًا جدًا عند استخدام foreach مع تعبيرات lambda. لدي هذا الكود: ```csharp var actions = new List(); var numbers = new List { 1, 2, 3, 4, 5 }; foreach (var number in numbers) { actions.Add(() => Console.WriteLine(number)); } foreach (var action in actions) { action(); } ``` كنت أتوقع أن تتم طباعة ما يلي على وحدة التحكم: ``` 1 2 3 4 5 ``` لكن بدلاً من ذلك أرى: ``` 5 5 5 5 5 ``` لماذا يحدث هذا؟ قرأت أن الأمر يتعلق بكيفية معالجة C# لمتغير الحلقة في foreach. لكنني لا أفهم لماذا يتصرف كمتغير "نفسه" في كل تكرار، بدلاً من إنشائه من جديد. في حلقة for، على حد علمي، كل شيء يعمل بشكل طبيعي. هل يمكن لأحد أن يشرح ما المشكلة هنا؟ والأهم من ذلك — كيف يمكن إصلاح هذا الكود بشكل صحيح للحصول على النتيجة المتوقعة؟ شكرًا مقدمًا! <<>>

سبب المشكلة: