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

时间:2013-01-17 14:15:38

标签: 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));
    }
});

我做错了什么?

3 个答案:

答案 0 :(得分:33)

您必须明确地将其强制转换为Action才能转换为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));
    }
}));

答案 1 :(得分:14)

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

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

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

BeginInvoke(new MethodInvoker(() => { ... }));

答案 2 :(得分:3)

尝试

Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate
{
//Do something
}));

或使用动作