I understand plenty of questions have been raised and answered or discussed on C# closure. But please spare me a little time on my little experiment ...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (var timer = new Timer(500)) { timer.AutoReset = false; GetFunc2(timer, 0); // GetFunc3(timer, 0); timer.Start(); Console.ReadLine(); } } static void GetFunc2(Timer timer, int i) { for (; i < 5; ++i) { timer.Elapsed += (obj, e) => { Console.WriteLine(i); }; } } static void GetFunc3(Timer timer, int i) { timer.Elapsed += (obj, e) => { Console.WriteLine(i++); }; timer.Elapsed += (obj, e) => { Console.WriteLine(i++); }; timer.Elapsed += (obj, e) => { Console.WriteLine(i++); }; timer.Elapsed += (obj, e) => { Console.WriteLine(i++); }; timer.Elapsed += (obj, e) => { Console.WriteLine(i++); }; } } } By calling GetFunc2 and GetFunc3 in the Main individually, we can see the outputs are different although GetFun3 looks merely like a simple expansion of GetFunc2. Any one knows why? I think ildasm can reveal the different generated code, but I do want to know why. Tested on VS2012 Pro, .net 4.5.