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

The*_*l26 9 c# action

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

无法从'void'转换为'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));     
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*idG 11

你的Invoke方法是期待的,Action但你试图传递一个方法的返回值,在这种情况下是void.相反,您可以使用lambda来创建Action:

Invoke(() => Method2(testParam));
Run Code Online (Sandbox Code Playgroud)

或者更明确:

Action a = () => Method2(testParam);
Invoke(a);
Run Code Online (Sandbox Code Playgroud)

第一个版本适合你的原因是传递一个没有尾随的方法()是上面代码的简写.所以这些是等价的:

Invoke(Method1);
Invoke(() => Method1());
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 6

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

你在这里需要一个 lambda:

Invoke(() => Method2(testParam));
Run Code Online (Sandbox Code Playgroud)

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