无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型?

Nie*_*els 13 c# wpf delegates

我遇到了一个我似乎无法弄清楚的问题,尽管它在Stackoverflow上有一个标准问题.

我正在尝试使用以下代码异步更新我的Bing地图(请注意,这是来自旧的Silverlight项目,似乎在WPF中不起作用)

_map.Dispatcher.BeginInvoke(() =>
{
    _map.Children.Clear();
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map)))
    {
        _map.Children.Add(projectedPin.GetElement(ClusterTemplate));
    }
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Jea*_*nal 35

您必须明确地将其强制Action转换为a System.Delegate才能启动转换.

那是:

_map.Dispatcher.BeginInvoke((Action)(() =>
{
    _map.Children.Clear();
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map)))
    {
        _map.Children.Add(projectedPin.GetElement(ClusterTemplate));
    }
}));
Run Code Online (Sandbox Code Playgroud)

  • 为了您的兴趣,您可能希望看到我在SLaks回答中添加的评论 (5认同)

SLa*_*aks 14

BeginInvoke()方法的参数是基Delegate类.

您只能将lambda表达式转换为具体的委托类型.

要解决此问题,您需要显式构造委托:

BeginInvoke(new MethodInvoker(() => { ... }));
Run Code Online (Sandbox Code Playgroud)

  • 鲜为人知的事实是:在这里使用`MethodInvoker`,而不是`Action` /`ThreadStart`等等,这是微不足道的*更高效 - 即使签名是相同的:它在`Control.InvokeMarshaledCallbackDo`中有直接支持(通过`是`/ cast) - 其他 - 如其他委托类型使用`DynamicInvoke`.唯一其他直接支持的委托类型是`WaitCallback`和`EventHandler` (12认同)