是否有办法避免在这样的场景中明确声明MyMethodDelegate
?
bool MyMethod(string x)
{
//...
}
BeginInvoke(new MyMethodDelegate(MyMethod), x);
我知道lambdas a-la ()=>MyMethod(x)
,但我有时会因为他们打破编辑并继续而避免使用它们。
修改:只有BeginInvoke(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)
实例化哪个委托类型
答案 0 :(得分:3)
您经常可以使用简化版
MyMethod
需要代表时。关键字经常。
但是,如果编译器无法确定将方法组转换为哪种类型的委托,则必须帮助进行显式转换
如果希望传递一个尚未定义但在代码中不需要的函数,Lambda可以派上用场。然后Lambdas(以及一般的匿名函数)将非常方便,因为您可以在您需要的位置简单地定义函数。
在BeginInvoke的情况下,您是正确的,如注释中所述,您不能通过强制转换或通过赋值将方法组显式转换为委托
Func<int,bool) m = MyMethod;
BeginInvoke(m,x);
BeginInvoke((Func<inte,bool>)MyMethod,x);
将编译或您可以传入lambda,因为它被解释为Func
BeginInvoke(a=>MyMethod(a),x);
答案 1 :(得分:3)
对于框架&gt; = 3.5,您可以使用预定义的委托Action&lt;&gt;和Func&lt;&gt; (在你的情况下)
BeginInvoke(new Func<int, bool>(MyMethod), x);
Func的文档 http://msdn.microsoft.com/ru-ru/library/bb549151.aspx