Action
在 .NET 3.5 框架中添加为不带参数也不返回任何内容的通用委托,而MethodInvoker
自 1.1 以来就存在,因此您通常只会看到使用MethodInvoker
. 这两种委托类型具有相同的签名。
BeginInvoke()
实际上需要一个Delegate
对象,因此任何不带参数的委托都可以与该重载一起使用。(需要参数的委托有一个(Delegate, object[])
重载,尽管我倾向于使用无参数闭包。)
因为Delegate
是通用类型,所以您必须以某种方式指定您提供的委托类型,因为编译器无法以其他方式推断它(见下文)。这比new Action
替代方法短,但只有几个字符,而且实际上或多或少都不清楚:
this.BeginInvoke((Action)(() => { ... }));
您必须在此处指定委托类型,因为编译器不知道您想要哪种委托类型。例如:
Action foo = () => { };
这是可行的,因为编译器可以根据foo
委托类型应该是的类型进行推断Action
。
// All of these examples cause CS1660.
Delegate foo1 = () => { };
object foo2 = () => { };
var foo3 = () => { };
这些是编译时错误,因为有许多委托类型与签名“不接受参数并返回void
”相匹配,并且编译器不会假装知道您想要哪个。(在object
和var
情况下,您可能还指的是一个Expression<>
对象,它根本不是委托。但是,如果您使用delegate () {}
而不是 lambda 表达式,您会得到相同的错误。)