今週、オランダで開催された TechDays 2013 に参加していたところ、興味深いクイズが出題されました。問題は次のプログラムの出力です。コードは次のようになります。
class Program
{
delegate void Writer();
static void Main(string[] args)
{
var writers = new List<Writer>();
for (int i = 0; i < 10; i++)
{
writers.Add(delegate { Console.WriteLine(i); });
}
foreach (Writer writer in writers)
{
writer();
}
}
}
明らかに、私が出した答えは間違っていました。int は値型であるため、渡される実際の値Console.WriteLine()
がコピーされるため、出力は 0...9 になります。ただしi
、この場合は参照型として扱われます。正解は、10 かける 10 と表示されることです。理由と方法を説明できる人はいますか?