将带参数的方法传递给接受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));
}
答案 0 :(得分:8)
您的Invoke
方法期待Action
,但您尝试将方法的返回值传递给void
。相反,您可以使用lambda来创建Action
:
Invoke(() => Method2(testParam));
或者更明确:
Action a = () => Method2(testParam);
Invoke(a);
第一个版本适合您的原因是传递方法而不尾随()
是上述代码的简写。所以这些是等价的:
Invoke(Method1);
Invoke(() => Method1());
答案 1 :(得分:2)
您的代码无法运行,因为Method2(testParam)
执行该方法,而不是在将来的任何时间提供可以执行的操作。
你需要一个lambda:
Invoke(() => Method2(testParam));
其他代码(Invoke(Method1)
)有效,因为你在这里为方法提供了一个委托(注意缺少的括号:没有执行,只是对方法的引用)。代表可以转换为动作。