给定以下代码:
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
值(与可变类型不同)。
当您在委托(delegate)中编写 i++
时,您正在将参数更改为等于不同的 int
值。但是,这不会影响其值被复制到参数的局部变量。
要解决这个问题,您需要创建一个带有ref
参数的委托(delegate)。 ref
参数通过引用传递。因此,当您将 ref int
参数更改为不同的 int
值时,您也会更改传递给其 reference 的局部变量或字段作为参数。
有关详细信息,请参阅 here .
由于 Action
委托(delegate)不接受 ref
参数,您需要创建自己的委托(delegate)类型,如下所示:
delegate void RefAction<T>(ref T param);
关于c# - 使用 Action<> 委托(delegate)时 int 递增的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233102/