2010-08-11 17 views
6

¿Por qué tengo este error y cómo solucionarlo? Gracias por la ayudaC# BeginInvoke problema

de error 4 No se puede convertir la expresión lambda para escribir 'System.Delegate' porque no es un tipo de delegado

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

Es mejor usar '' programación Task' o SynchronizationContext' en lugar de 'Dispatcher', por lo que su código BLL no está ligado a WPF/Silverlight . –

Respuesta

10

expresión Lambda no son convertir implícitamente a los delegados en ciertos casos. Específicamente, si el método espera el tipo Delegate primero tiene que lanzar explícitamente el lambda para que el compilador lo acepte.

Lo que puede hacer es convertir explícitamente la lambda, lo que debería permitir el uso de BeginInvoke:

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

Normalmente, si tiene un método con una firma del delegado inflexible de tipos, como:

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

El compilador puede convertir una expresión lambda a la firma de delegado apropiada necesaria. Pero si el método está vaciado a máquina:

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

el compilador no aceptará una lambda. Sin embargo, puede convertir la expresión lambda en una firma de delegado específica (por ejemplo, Acción) y luego pasarla al método. El compilador no puede hacer esto automáticamente, ya que hay muchos tipos de delegados diferentes que podrían ser una coincidencia válida para la firma de la lambda ... y el compilador no tiene forma de saber cuál sería la correcta.

3

moldeada a un objeto delegado, como Action

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