在FUNC中打印错误的结果

时间:2013-07-31 08:37:51

标签: c# func

我的代码有问题,代码需要打印这个结果:

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();

    }
}

1 个答案:

答案 0 :(得分: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]();
}
相关问题