无法从 'void' 转换为 'System.Action'
cannot convert from 'void' to 'System.Action'
将带有参数的方法传递给接受 Action 类型参数的方法会导致语法错误
Cannot convert from 'void' to '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
方法需要 Action
,但您正试图将方法的 return 值传递给它,在本例中为 void
。相反,您可以使用 lambda 来创建 Action
:
Invoke(() => Method2(testParam));
或者更明确地说:
Action a = () => Method2(testParam);
Invoke(a);
第一个版本适合您的原因是,对于上面的代码,传递一个没有尾随 ()
的方法是 shorthand。所以这些是等价的:
Invoke(Method1);
Invoke(() => Method1());
将带有参数的方法传递给接受 Action 类型参数的方法会导致语法错误
Cannot convert from 'void' to '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
方法需要 Action
,但您正试图将方法的 return 值传递给它,在本例中为 void
。相反,您可以使用 lambda 来创建 Action
:
Invoke(() => Method2(testParam));
或者更明确地说:
Action a = () => Method2(testParam);
Invoke(a);
第一个版本适合您的原因是,对于上面的代码,传递一个没有尾随 ()
的方法是 shorthand。所以这些是等价的:
Invoke(Method1);
Invoke(() => Method1());