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

时间:2018-03-28 14:51:50

标签: 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));     
}

2 个答案:

答案 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))有效,因为你在这里为方法提供了一个委托(注意缺少的括号:没有执行,只是对方法的引用)。代表可以转换为动作。