-1

このコードに問題があります。コードはこの結果を出力する必要があります:

56789 56789

しかし結果は: 99999 99999

なぜ?

   class Program

    {

     static int m_k = 0;
    static Func<int>[] P=new Func<int>[5];

    static void F(int n,Func<int>[] T)
    {
        if (n>0)
        {

            P[m_k] = () => T[m_k]();
            m_k++;
            F(n-1,T);
        }
        else
        {
            P[m_k] = () => T[m_k]();
        }
    }
    static void Main(string[] args)
    {
        Func<int>[] T = new Func<int>[5];
        Func<int>[] S = new Func<int>[5];
        T[0] = () => 5;
        T[1] = () => 6;
        T[2] = () => 7;
        T[3] = () => 8;
        T[4] = () => 9;
        for (int i = 0; i < 4; i++)
        {

            S[i] = () => T[i]();
        }

        for (int i = 0; i < 4; i++)
        {
            Console.WriteLine(S[i]());
        }
        F(4,T);
        for (int i = 0; i < 4; i++)
        {
            Console.WriteLine(P[i]());
        }
        Console.ReadKey();

    }
}
4

1 に答える 1

0

変更された cluser にアクセスしようとしています!!! コンピューター サイエンスでは、クロージャはレキシカル環境でバインドされた自由変数を持つ第一級の関数です。

これにより、このコードを修正できます。

static void F(int n,Func<int>[] T)
{
      if (n>0)
      {
          int tmp=m_k
          P[m_k] = () => T[tmp]();
          m_k++;
          F(n-1,T);
      }
      else
      {
          P[m_k] = () => T[m_k]();
      }
}

そしてこれによって:

for (int i = 0; i < 4; i++)
{
    int j=i;
    S[i] = () => T[j]();
}
于 2013-07-31T08:38:44.050 に答える