Проблема с С# BeginInvoke

Почему у меня есть эта ошибка и как ее исправить. Спасибо за помощь

Ошибка 4 Невозможно преобразовать лямбда-выражение для ввода "System.Delegate", потому что это не тип делегата

void provider_GetAssignmentsComplete(object sender, QP_Truck_Model.Providers.GetAssignmentsEventArgs e) {
 lvMyAssignments.Dispatcher.BeginInvoke(() =>
 {
 lvMyAssignments.ItemsSource = e.HandOverDocs;
 });
 }
2 ответа

В некоторых случаях выражение Lambda неявно конвертируется в делегатов. В частности, если метод ожидает тип Delegate, вы должны сначала явно указать lambda для компилятора, чтобы принять его.

Что вы можете сделать, так это явно лить лямбда, что должно позволить вам использовать BeginInvoke:

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

Обычно, если у вас есть метод с строго типизированной подписью делегата, например:

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

Компилятор может преобразовать лямбда-выражение в соответствующую подпись делегата. Но если метод слабо напечатан:

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

компилятор не примет lambda. Однако вы можете применить выражение лямбда к определенной подписке делегата (например, Action), а затем передать это методу. Компилятор не может автоматически сделать это для вас, потому что существует много разных типов делегатов, которые могут быть допустимым совпадением для сигнатуры лямбда... и компилятор не знает, что будет правильным.


Передайте его объекту Delegate, например Action

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

licensed under cc by-sa 3.0 with attribution.