无法从 'void' 转换为 'System.Action'

cannot convert from 'void' to 'System.Action'

将带有参数的方法传递给接受 Action 类型参数的方法会导致语法错误

Cannot convert from 'void' to 'System.Action'

但是,如果我向它传递一个没有任何参数的方法,它就可以正常工作。

我假设 C# 在我向它传递一个没有参数的方法时会自动执行某些操作。

我想知道它在幕后做了什么,以及如何用有参数的方法做同样的事情。

public void Invoke(Action action){ /*Code Here */ }

public void Method1(){ /*Code Here */}

public void Method2(int param){ /*Code Here */ }

public void test()
{
    int testParam = 1;
    //** This works
    Invoke(Method1);
    //** This does not work
    Invoke(Method2(testParam));     
}

您的代码不起作用,因为 Method2(testParam) 执行了该方法,而不是提供一个 可以在将来任何时间执行 的操作。

你需要一个 lambda:

Invoke(() => Method2(testParam));

其他代码 (Invoke(Method1)) 有效,因为您在此处为该方法提供了一个委托(请注意缺少的括号:没有执行,只是对该方法的引用)。委托可以转换为动作。

您的 Invoke 方法需要 Action,但您正试图将方法的 return 值传递给它,在本例中为 void。相反,您可以使用 lambda 来创建 Action:

Invoke(() => Method2(testParam));

或者更明确地说:

Action a = () => Method2(testParam);
Invoke(a);

第一个版本适合您的原因是,对于上面的代码,传递一个没有尾随 () 的方法是 shorthand。所以这些是等价的:

Invoke(Method1);
Invoke(() => Method1());