给出以下代码:
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);