【问题标题】:C# BeginInvoke problemC# BeginInvoke 问题
【发布时间】:2010-08-11 23:08:24
【问题描述】:

为什么会出现此错误以及如何修复它。感谢帮助

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

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

【问题讨论】:

  • 最好使用Task调度或SynchronizationContext而不是Dispatcher,这样你的BLL代码就不会绑定到WPF/Silverlight。

标签: c# wpf


【解决方案1】:

在某些情况下,Lambda 表达式不能隐式转换为委托。具体来说,如果该方法需要 Delegate 类型,您必须首先显式转换 lambda 以便编译器接受它。

您可以做的是显式转换 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 签名的有效匹配......并且编译器无法知道哪个是正确的。

【讨论】:

    【解决方案2】:

    将其转换为 Delegate 对象,例如 Action

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2014-01-22
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2013-01-01
      • 2013-09-24
      • 1970-01-01
      相关资源
      最近更新 更多