我在以下情况下遇到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]);
我查阅了有关它的所有帖子,但我无法弄清楚/明白为什么?并且答案也没有解决我的问题。
答案 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);