C#-来自方法的自动委托类型
有没有办法避免在这样的场景中显式声明C#-来自方法的自动委托类型,c#,methods,delegates,invoke,C#,Methods,Delegates,Invoke,有没有办法避免在这样的场景中显式声明MyMethodDelegate bool MyMethod(string x) { //... } BeginInvoke(new MyMethodDelegate(MyMethod), x); 我知道lambdas a-la()=>MyMethod(x),但有时我想避免它们,因为它们会中断编辑并继续 编辑:仅开始InVoke(MyMethod,x)不起作用: The best overloaded method match for 'Syste
MyMethodDelegate
bool MyMethod(string x)
{
//...
}
BeginInvoke(new MyMethodDelegate(MyMethod), x);
我知道lambdas a-la()=>MyMethod(x)
,但有时我想避免它们,因为它们会中断编辑并继续
编辑:仅开始InVoke(MyMethod,x)
不起作用:
The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments
Argument 1: cannot convert from 'method group' to 'System.Delegate'
Argument 2: cannot convert from 'string' to 'object[]'
BeginInvoke的定义如下:
public IAsyncResult BeginInvoke(Delegate method, params object[] args);
它没有指定任何特定的委托类型,因此编译器无法检测从
BeginInvoke(MyMethod.x)
实例化哪个委托类型。您通常可以使用简化版本
MyMethod
当需要委托时。关键字通常是
但是,如果编译器无法确定要将方法组转换为哪种类型的委托,则必须帮助进行显式转换
当您希望传递尚未定义且在代码中其他位置不需要的函数时,Lambdas可以派上用场。然后Lambdas(以及通常的匿名函数)将非常方便,因为您可以在需要的地方简单地定义函数
在BeginInvoke的情况下,正如注释中指出的那样,您是正确的。您需要通过强制转换或赋值将方法组显式转换为委托
Func<int,bool) m = MyMethod;
BeginInvoke(m,x);
BeginInvoke((Func<inte,bool>)MyMethod,x);
对于大于等于3.5的框架,您可以使用预定义的委托操作和Func(在您的情况下)
BeginInvoke(新函数(MyMethod),x);
Func文档
不起作用,因为BeginInvoke()需要一个通用委托。更新帖子。@IvanShcherbakov您已经写过,不能将MyMethod作为不带参数的委托传递,这是真的,因为MyMethod带参数。我已经很久没有写“BeginInvoke”了,但如果你真的通过了一个论证,我希望它能起作用。为了简单起见,我把它放在这里了。很明显,我已经在实际代码中传递了它。@Ivan你所做的与你所说的实际做的没有什么明显不同:)好的,对不起。我假设问题显然是在从MyMethod到delegate的转换中,而不是在下面的“params object[]args”中。尽管如此,它还是不起作用。快告诉我。尽管根据OP的规定,
int
应该是字符串
。
BeginInvoke(a=>MyMethod(a),x);
BeginInvoke(new Func<int, bool>(MyMethod), x);