将动态对象和Action传递给函数时出错

时间:2017-08-15 15:57:19

标签: c# dynamic lambda

我正在尝试将动态对象传递给函数。 (下面是一个简单的测试)但是,我得到以下编译时错误:

  

如果不首先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态分派操作的参数。

其中一个是好的......但不是两个......任何帮助?

    void Test()
    {
        dynamic obj = new System.Dynamic.ExpandoObject();
        obj.A = 1;
        obj.B = 2;
        Calc(obj, (result) =>
        {
            Console.Write("Result: " + result);
        });    
    }

    void Calc(dynamic obj, Action<int> onComplete)
    {
        onComplete((int)obj.A + (int)obj.B);
    }

1 个答案:

答案 0 :(得分:3)

当然 - 完全按照编译器的说法 - 将lambda表达式强制转换为具体类型:

Calc(obj, (Action<int>)(result => Console.Write("Result: " + result)));

你必须这样做的原因是lambda表达式没有类型 - 编译器必须知道你试图将它转换为什么委托(或表达式树)类型。如果你要调用的方法在执行时间之前被选中,那么它就不能这样做,这是另一个参数是动态的情况。