2013-01-17 1 views
10

Ich habe ein Problem, das ich nicht herausfinden kann, obwohl es eine Art Standardfrage hier auf Stackoverflow ist.Kann Lambda-Ausdruck nicht in Typ 'System.Delegate' konvertieren, da es kein Delegattyp ist?

Ich versuche, meine Bing Maps zu aktualisieren asynchron mit dem folgenden Code (beachten Sie, das aus einem alten Silverlight-Projekt ist und scheint nicht in WPF arbeiten)

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

Was ich tue, falsch ?

+6

Und was ist mit '(Aktion) ((=) => ...)'? – acrilige

+0

@acrilige danke! Warum hast du das nicht als Antwort gemacht? –

Antwort

30

Sie haben es zu einem Action, um für die Umstellung auf System.Delegate explizit zu werfen in

zu treten, das ist :

_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

Für Ihr Interesse möchten Sie vielleicht den Kommentar sehen, den ich zur Antwort von SLaks hinzugefügt habe. –

13

Der BeginInvoke() Parameter der Methode ist die Basis Delegate Klasse.

Sie können einen Lambda-Ausdruck nur in einen konkreten Delegattyp konvertieren.

um dieses Problem zu beheben, müssen Sie einen Delegaten explizit konstruieren.

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

Wenig bekannte Tatsache: es ist * marginal * effizienter 'MethodInvoker' zu verwenden als' Action'/'ThreadStart' usw. - obwohl die Signatur identisch ist: sie hat direkte Unterstützung in' Control.InvokeMarshaledCallbackDo' (via 'is'/cast) - wo-wie andere Delegattypen' DynamicInvoke' verwenden. Die einzigen anderen direkt unterstützten Delegattypen sind 'WaitCallback' und' EventHandler'. –

2

Versuchen

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

Oder verwenden Sie Aktion

+4

Für Ihr Interesse möchten Sie vielleicht den Kommentar sehen, den ich SLaks hinzugefügt habe 'Antwort –

+0

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx: Der Delegat kann eine Instanz von EventHandler sein, in diesem Fall wird der Sender-Parameter dieses Steuerelement enthalten, und der Ereignisparameter wird enthält EventArgs.Empty. Der Delegat kann auch eine Instanz von MethodInvoker oder ein anderer Delegat sein, der eine void-Parameterliste verwendet. Ein Aufruf an einen EventHandler- oder MethodInvoker-Delegaten ist schneller als ein Aufruf an einen anderen Delegattyp. – Alex