给出以下代码:

class Sample
{
 public static void Run()
 {
     int i = 1;
     Action<int> change = Increment();
     for (int x = 0; x < 5; x++ )
     {
         change(i);
         Console.WriteLine("value=" + i.ToString());
     }
 }

 public static Action<int> Increment()
 {
      return delegate(int i) { i++; };
 }


}

我得到答案:

值= 1
 值= 1
 值= 1
 值= 1
 值= 1
 值= 1

代替1,2,3 ... 6。

这是来自网络上的文章,其中提供了线索链接,但我不知道为什么会这样。有人有想法么?

最佳答案

您的参数正在按值传递。

写入i++会将i的值更改为不同的int值(与可变类型不同)。
当您在委托中写入i++时,您正在将参数更改为等于不同的int值。但是,这不会影响其值已复制到参数的局部变量。

要解决此问题,您需要使用ref参数创建一个委托。 ref参数通过引用传递。因此,当将ref int参数更改为其他int值时,还将更改将引用作为参数传递的局部变量或字段。

有关更多信息,请参见here

由于Action委托不采用ref参数,因此您需要创建自己的委托类型,如下所示:

delegate void RefAction<T>(ref T param);

10-08 08:44
查看更多