-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

您尝试访问修改后的集群!!!在计算机科学中,闭包是一个一流的函数,具有绑定在词法环境中的自由变量。

您可以通过以下方式修复此代码:

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 回答