Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从';无效';至';系统行动';_C#_Action - Fatal编程技术网

C# 无法从';无效';至';系统行动';

C# 无法从';无效';至';系统行动';,c#,action,C#,Action,将带有参数的方法传递给接受操作类型参数的方法会导致语法错误 无法从“void”转换为“System.Action” 但是,如果我传递给它一个没有任何参数的方法,它就可以正常工作 我假设当我传递一个没有参数的方法时,C#会自动执行某些操作 我想知道它在幕后做了什么,以及如何对具有参数的方法进行同样的操作 public void Invoke(Action action){ /*Code Here */ } public void Method1(){ /*Code Here */} publi

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

无法从“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));     
}

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

您需要一个lambda:

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

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

您的
Invoke
方法需要一个
操作
,但您试图将方法的返回值传递给它,在本例中,该方法的返回值为
void
。相反,您可以使用lambda创建
操作

Invoke(() => Method2(testParam));
或者更明确地说:

Action a = () => Method2(testParam);
Invoke(a);
第一个版本适用于您的原因是,传递一个不带尾部的方法是上述代码的简写形式。所以这些是等价的:

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

Invoke(()=>Method2(testParam))
Method2(testParam)
您刚刚调用了一个函数。它不返回任何内容,因此您会得到一个错误。@Servy,这不是一个重复的问题,因为我收到了不同的错误消息。@Colonel26您有完全相同的错误消息、完全相同的问题和完全相同的解决方案。这是一模一样的。你看过答案了吗?“把这个答案应用到你的问题上怎么没能解决你的问题呢?”Colonel26这很奇怪,因为我把你问题的标题复制粘贴到了谷歌上,这是最好的结果。我就是这样找到了你的真实情况的副本的。事实上,您的问题措辞略有不同,但这并没有妨碍您查找重复项的能力,也没有改变使用完全相同的解决方案解决完全相同的问题的事实。为什么调用(方法1)有效?为什么编译器假定我要发送调用一个操作,而不是方法的返回类型?我会在回答中添加它。@colonel26,因为在这种情况下,您不会调用该方法,因为后面没有
()
。您正在传递C#中断的方法的名称,意思是要将其转换为委托。我也是。感谢@DavidGside评论:最近的投票结果让stack无法参加。我最初的评论是:您不需要为上一个调用调用(Method1)创建相同的lamda吗;。方法1不是在调用主体之前执行的吗?@tatmanblue不,它是一个委托。@PatrickHofman thnx@tatmanblue关于你的第一句话,不,它不是。高质量的内容(除了一些像DV这样的例子)通常会被选中。