在Invoke时无法将lambda表达式转换为'System.Delegate'类型

时间:2014-09-19 09:31:49

标签: c# invoke dispatcher

我在以下情况下遇到Cannot convert lambda expression to type 'System.Delegate'错误:

this.Dispatcher.Invoke((Delegate)(() =>
            {
                this.Focus();
                if (!moveFocus)
                    return;
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }), DispatcherPriority.Background, new object[0]);

我查阅了有关它的所有帖子,但我无法弄清楚/明白为什么?并且答案也没有解决我的问题。

3 个答案:

答案 0 :(得分:6)

Lambda表达式无法直接转换为Delegate。但是,如果方法需要某个类型的委托(例如Action),那么您可以使用lambda表达式而不进行强制转换。例如,在 .Net 4.5 中存在重载:

public void Invoke(Action callback,DispatcherPriority priority)

这意味着你可以这样做:

this.Dispatcher.Invoke(() =>
        {
            //...
        }, DispatcherPriority.Background);

但.Net 4或之前不存在该重载。所以你必须投射到Action

this.Dispatcher.Invoke((Action)(() =>
    {
        ...
    }), DispatcherPriority.Background); 

请注意,我删除了new object[0]。由于Action没有采取任何参数,因此不需要它。

答案 1 :(得分:4)

请勿投放到Delegate,而是投放到Action

this.Dispatcher.Invoke((Action)(() =>
        {
            ...
        }), DispatcherPriority.Background, new object[0]);

答案 2 :(得分:1)

您不需要强制转换为将编译器隐式转换为委托类型的lambda表达式委托

this.Dispatcher.Invoke(() =>
            {
                this.Focus();
                if (!moveFocus)
                    return;
                this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }, DispatcherPriority.Background);