【发布时间】:2013-05-02 00:33:27
【问题描述】:
我发现了两种不同的方法来使用 Action 初始化委托:
创建一个新动作或强制转换为动作。
Delegate foo = new Action(() => DoNothing(param));
Delegate bar = (Action)(() => DoNothing(param));
这两种语法有区别吗?
哪个更好,为什么?
在此示例中使用了委托,因为语法对于使用 lambda 表达式调用 BeginInvoke 或 Invoke 等方法很有用,并且将 lambda 表达式转换为操作很重要
static main
{
Invoke((Action)(() => DoNothing())); // OK
Invoke(new Action(() => DoNothing())); // OK
Invoke(() => DoNothing()); // Doesn't compil
}
private static void Invoke(Delegate del) { }
但有趣的是编译器授权了这个:
Action action = () => DoNothing();
Invoke(action);
【问题讨论】:
-
致您的编辑:您的
staticInvoke方法中会有哪些有意义的内容? -
没什么有趣的。这个问题的目的只是为了理解这两种语法之间的区别。当我调用 Dispatcher.Invoke() (msdn.microsoft.com/en-us/library/cc647509(v=vs.100).aspx) 时,我真正的实现是在 WPF 应用程序中
-
我明白了。你应该还记得
Action是Delegate,因为Action派生自Delegate。因此,即使您使用接收Delegate的重载,您也可以给它一个Action。示例:Action bar = () => DoNothing(param); someDispatcher.BeginInvoke(bar);(参见Dispatcher.BeginInvoke)。另外:在较新版本的框架 .NET 4.5 中,Dispatcher.Invoke与Action的重载,但这只是为了方便起见,请参阅 msdn.microsoft.com/en-us/library/hh199416.aspx。 -
我明白这一点。但是编译器不会将 lambda 表达式隐式转换为委托,而是将其转换为操作(它是委托)。这是另一个主题:)
标签: c# casting delegates lambda action