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);