为什么以下静态功能不起作用?

Moh*_*kar 0 .net c# action func

这是我的代码:

public static class s {

    public static int Dx(this int i, Action<int> act, Func<int, bool> con) {
        if (con(i)) act(i);
        return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

后来在我的代码中我做了:

int g = 22;
int false_con = g.Dx(j => j = 11, z => z != 22); // This is 22 which is fine.
int true_con = g.Dx(j => j = 11, z => z == 22);  //This is also 22 which should be 11
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Eri*_*ert 16

迄今为止给出的答案都不是实际的解释.

到目前为止给出的一些答案表明这是因为int是值类型.尝试在此程序int中用objects 替换所有s .它是否像原始海报所期望的那样开始工作?不.那么它与值类型和引用类型无关.

相反,它与变量的值有关,无论其类型如何.

Mahdi,您的期望是形式参数j成为形式参数的别名,而形式参数i又是局部变量的别名g,因此任何更改j也会导致更改,g因为它们是相同的变量.事实并非如此.j,i并且g相同值的副本但具有不同的存储位置,因此变异不会使另一个变异.

您在C#中说"此形式参数是此变量的别名"的方式是使用refout关键字.所以这个程序会做你期望的:

delegate void RefAction<T>(ref T t);
...
public static int Dx(ref int i, RefAction<int> act, Func<int, bool> con) 
{
    if (con(i)) 
        act(ref i);
    return i;
}
...
int g = 22;
int false_con = Dx(ref g, (ref int j) => { j = 11; }, z => z != 22); 
int true_con = Dx(ref g, (ref int j) => { j = 11; }, z => z == 22); 
Run Code Online (Sandbox Code Playgroud)

"参考"关键字的意思是g,ij是同一变量的所有不同的名字.

正如D斯坦利所说,这可能是糟糕的风格.而不是改变方法中的变量,而是返回您希望将其更改为的值,并让调用者决定要变异的变量(如果有).