gpt4 book ai didi

c# - 这种 MethodInvoker 用法的正确语法是什么?

转载 作者:行者123 更新时间:2023-11-30 14:41:49 25 4
gpt4 key购买 nike

以下代码可以正常编译和运行。

void myInvokedMethod(string s)
{
Console.WriteLine(s);
}

void myInvoker()
{
Invoke(new MethodInvoker(delegate() { myInvokedMethod("one"); }));
Invoke(new MethodInvoker(delegate { myInvokedMethod("two"); }));
}

当我调用 myInvoker 时,对 myInvokedMethod 的两个调用都会通过。 delegate 后的括号是什么意思,为什么它们看起来是可选的?

最佳答案

括号内称为匿名方法参数列表,本例为空。匿名方法没有类型——编译器试图执行隐式转换。如果给出匿名方法的签名,则它必须与委托(delegate)人的签名相匹配。

如果满足以下条件,也可以进行隐式转换:

  • 省略委托(delegate)的形参列表
  • 委托(delegate)没有输出参数
  • 返回类型匹配

您的第二个示例就是这种情况。所以这两行之间没有区别——都做同样的事情。这是另一个例子:

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 节。

关于c# - 这种 MethodInvoker 用法的正确语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com