C# のクロージャに関して、多くの質問が提起され、回答または議論されていることを理解しています。しかし、私の小さな実験に少し時間を割いてください...
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++);
};
}
}
}
と を個別に呼び出すGetFunc2
とGetFunc3
、単に を単純に展開したように見えMain
ますが、出力が異なることがわかります。誰でも理由を知っていますか?ildasm は生成されたさまざまなコードを明らかにできると思いますが、その理由を知りたいです。VS2012 Pro、.net 4.5 でテスト済み。GetFun3
GetFunc2