2010-08-11 8 views
6

Warum habe ich diesen Fehler und wie man es behebt. Vielen Dank für die HilfeC# BeginInvoke Problem

Fehler 4 Kann nicht Lambda-Ausdruck geben ‚System.Delegate‘ umwandeln, weil es nicht eine Art delegieren ist

void provider_GetAssignmentsComplete(object sender, QP_Truck_Model.Providers.GetAssignmentsEventArgs e) { 
     lvMyAssignments.Dispatcher.BeginInvoke(() => 
     { 
      lvMyAssignments.ItemsSource = e.HandOverDocs; 
     }); 
    } 
+0

Es ist besser, zu verwenden 'Task' Scheduling oder' SynchronizationContext' anstatt 'Dispatcher', so dass Ihr BLL-Code nicht zu WPF/Silverlight gebunden ist . –

Antwort

10

Lambda Ausdruck nicht implizit konvertierbar Delegierten in bestimmten Fällen. Wenn die Methode den Typ Delegate erwartet, müssen Sie das Lambda explizit zuerst für den Compiler umwandeln, um es zu akzeptieren.

Was können Sie tun, explizit das Lambda gegossen, die Sie verwenden lassen sollen BeginInvoke:

lvMyAssignments.Dispatcher.BeginInvoke((Action)(() => 
     { 
      lvMyAssignments.ItemsSource = e.HandOverDocs; 
     })); 

Normalerweise, wenn Sie eine Methode mit einem stark typisierten Delegaten Signatur, wie:

public static void BeginInvoke(Action d) { ... } 

Der Compiler kann einen Lambda-Ausdruck in die entsprechende erforderliche Delegatensignatur konvertieren. Aber wenn die Methode lose typisiert ist:

public static void BeginInvoke(Delegate d) { ... } 

der Compiler akzeptiert kein Lambda. Sie können den Lambda-Ausdruck jedoch in eine bestimmte Delegatensignatur (z. B. Aktion) umwandeln und diese dann an die Methode übergeben. Der Compiler kann dies nicht automatisch für Sie tun, da es viele verschiedene Delegattypen gibt, die eine gültige Übereinstimmung für die Signatur des Lambda darstellen können ... und der Compiler hat keine Möglichkeit zu wissen, welcher der richtige wäre.

3

Guss es zu einem Delegate-Objekt, wie Action

lvMyAssignments.Dispatcher.BeginInvoke((Action)(() => lvMyAssignments.ItemsSource = e.HandOverDocs)));