2010-08-11 30 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)));