2010-08-11 12 views
6

Dlaczego mam ten błąd i jak to naprawić. Dzięki za pomocC# BeginInvoke problem

Error 4 nie można przekonwertować wyrażenia lambda, aby wpisać „System.Delegate”, ponieważ nie jest to typ delegata

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

Lepiej użyć 'Task' harmonogramu lub' SynchronizationContext' zamiast 'Dispatcher', tak że kod BLL nie jest związana z WPF/Silverlight . –

Odpowiedz

10

wyrażenie lambda nie są niejawnie zamienny do delegatów w niektórych przypadkach. W szczególności, jeśli metoda wymaga typu Delegate, musisz najpierw wyraźnie rzucić lambdę, aby kompilator ją zaakceptował.

Co można zrobić, to wyraźnie rzutować lambda, co powinno pozwolić na użycie BeginInvoke:

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

Normalnie, jeśli masz metodę z silnie wpisany podpisu delegata takiego:

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

Kompilator może przekonwertować wyrażenie lambda na odpowiedni podpis pełnomocnika. Ale jeśli metoda jest luźno wpisana:

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

kompilator nie zaakceptuje lambda. Można jednak rzucić wyrażenie lambda do określonego podpisu delegata (powiedzmy akcji), a następnie przekazać to do metody. Kompilator nie może automatycznie zrobić tego za ciebie, ponieważ istnieje wiele różnych typów delegatów, które mogą być poprawnym dopasowaniem do podpisu lambda ... a kompilator nie ma możliwości sprawdzenia, który z nich jest właściwy.

3

oddanych do obiektu delegata takich jak Action

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