以下代码编译并运行正常。
void myInvokedMethod(string s)
{
Console.WriteLine(s);
}
void myInvoker()
{
Invoke(new MethodInvoker(delegate() { myInvokedMethod("one"); }));
Invoke(new MethodInvoker(delegate { myInvokedMethod("two"); }));
}
当我致电 myInvoker 时,两次对 myInvokedMethod 的调用都会通过。 委托后的括号是什么意思,为什么它们看起来是可选的?
答案 0 :(得分:3)
它们指定了anonymous method所采用的形式参数,如果没有,则它们是可选的。如果声明它没有参数列表,则可以将其分配给具有参数的委托类型。
答案 1 :(得分:3)
括号称为匿名方法参数列表,在这种情况下为空。匿名方法没有类型 - 编译器尝试执行隐式转换。如果给出了匿名方法的签名,则它必须与委托的签名匹配。
如果以下所有内容都成立,则也可以进行隐式转换:
第二个例子就是这种情况。所以这两行之间没有区别 - 两者都做同样的事情。这是另一个例子:
var x1 = new ParameterizedThreadStart(delegate(object o) {}); // Compiles.
var x2 = new ParameterizedThreadStart(delegate {}); // Compiles.
var x3 = new ParameterizedThreadStart(delegate() {}); // Does not compile.
最后两个示例显示delegate(){}
和delegate{}
一般不相同。它们仅在您的情况下是等效的,因为MethodInvoker
不带参数。有关更多详细信息和更多示例,请参阅C#规范第21节。