2010-08-11 106 views
6

为什么我有这个错误以及如何解决它。感谢您的帮助C#BeginInvoke问题

错误4无法转换lambda表达式键入“System.Delegate”,因为它不是一个委托类型

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

这是更好地使用'Task'调度或'SynchronizationContext'而不是'Dispatcher',让您的BLL的代码是不依赖于WPF/Silverlight的。 – 2010-08-11 17:47:49

回答

10

Lambda表达式不能隐式转换在某些情况下代表。具体而言,如果方法期望Delegate类型,则必须首先显式地将lambda转换为编译器才能接受它。

你可以做的是明确投拉姆达,这应该允许您使用BeginInvoke

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

通常情况下,如果你有一个强类型的委托签名的方法,如:

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

编译器可以将lambda表达式转换为所需的相应委托签名。但是,如果方法是松散类型的:

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

编译器将不接受lambda。但是,您可以将lambda表达式转换为特定的委托签名(例如Action),然后将其传递给该方法。编译器不能自动为你做这件事,因为有许多不同的委托类型可能是lambda签名的有效匹配...编译器无法知道哪个是正确的。

3

它转换为一个委托对象,如Action

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