将带参数的方法传递给接受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)
您的代码不起作用,因为执行该方法,而不是提供可以在将来随时执行的Method2(testParam)操作。
你在这里需要一个 lambda:
Invoke(() => Method2(testParam));
Run Code Online (Sandbox Code Playgroud)
另一个代码 ( Invoke(Method1)) 之所以有效,是因为您在此处为该方法提供了委托(请注意缺少括号:不执行,只是对该方法的引用)。委托可以转换为操作。