読者です 読者をやめる 読者になる 読者になる

匿名デリゲートのスコープ?

C#

どうやら、匿名デリゲートにおける変数のスコープがどうも俺の直感性と反するようである。

たとえば下記のコード、
public delegate void NoArgDelegate();

static NoArgDelegate InitializeOne()
{
NoArgDelegate
array = new NoArgDelegate[5];
for (int i = 0; i < array.Length; i++)
array[i] = delegate() { Console.WriteLine(i); };
return array;
}

を実行すると、直感的には
0
1
2
3
4

が出力されるように思える。
しかし、実際には
5
5
5
5
5

が出力される。
どうやら匿名デリゲートにおける変数スコープが呼び出し元の変数スコープとは異なるのが原因らしい。
このあたりの詳細について興味がある場合は C# Tutorial - Anonymous Delegates And Scoping が詳しいのでそちらを参照して欲しい。

これって匿名デリゲートのスコープ云々の問題じゃなくて、for のスコープの問題なんじゃないの?
for が i を使い回しているから起きるだけじゃ。

つまり、はじめのコードはちょうど以下のコード等価になるんじゃないかと。

public delegate void NoArgDelegate();

static NoArgDelegate[] InitializeOne()
{
  NoArgDelegate[] array = new NoArgDelegate[5];
  {
    int i;
    for (i = 0; i < array.Length; i++)
      array[i] = delegate() { Console.WriteLine(i); };
  }
  return array;
}

C# はろくにやったこともないが多分合ってる。