2013-01-17 15 views
10

Mam problem, którego nie mogę wymyślić, chociaż jest to standardowe pytanie na Stackoverflow.Nie można przekonwertować wyrażenia lambda na typ "System.Delegate", ponieważ nie jest to typ delegata?

Próbuję zaktualizować Bing Maps asynchronicznie za pomocą następującego kodu (Pamiętaj, to jest ze starego projektu Silverlight i nie wydają się działać w WPF)

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

Co robię źle ?

+6

A co z '(Action) (() => ...)'? – acrilige

+0

@acrilige thanks! dlaczego nie zrobiłeś tego jako odpowiedź ???? –

Odpowiedz

30

Musisz oddać go wprost do Action w celu konwersji do System.Delegate kopać w

To :

_map.Dispatcher.BeginInvoke((Action)(() => 
{ 
    _map.Children.Clear(); 
    foreach (var projectedPin in pinsToAdd.Where(pin => PointIsVisibleInMap(pin.ScreenLocation, _map))) 
    { 
     _map.Children.Add(projectedPin.GetElement(ClusterTemplate)); 
    } 
})); 
+5

Dla Twojego zainteresowania, możesz chcieć zobaczyć komentarz dodany do odpowiedzi SLaksa –

13

Parametr metody jest podstawową klasą Delegate.

Konwersję wyrażenia lambda można skonwertować tylko na konkretny typ delegata.

Aby rozwiązać ten problem, należy jawnie konstruować delegata.

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

Niewiele wiadomo: jest * nieznacznie * bardziej efektywne użycie tutaj 'MethodInvoker', niż' Action'/'ThreadStart', etc - nawet jeśli podpis jest identyczny: ma bezpośrednie wsparcie w' Control.InvokeMarshaledCallbackDo' (via 'is'/cast) - gdzie - tak jak inne typy delegatów używają' DynamicInvoke'. Jedynymi innymi obsługiwanymi bezpośrednio typami delegatów są 'WaitCallback' i' EventHandler' –

2

Spróbuj

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

Lub użyj akcji

+4

Dla Twojego zainteresowania, możesz chcieć zobaczyć komentarz dodany do SLaks "odpowiedź –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: Delegat może być instancją zdarzenia zdarzenia, w którym to przypadku parametr nadawcy będzie zawierał tę kontrolkę, a parametr zdarzenia będzie zawierać EventArgs.Empty. Delegat może być także instancją MethodInvoker lub innym delegatem, który przyjmuje listę parametrów void. Wywołanie do elementu EventHandler lub delegata MethodInvoker będzie szybsze niż wywołanie innego typu delegata. – Alex

Powiązane problemy