【问题标题】:Ignore return type from a Expression.Call忽略 Expression.Call 的返回类型
【发布时间】:2011-09-28 18:00:14
【问题描述】:

当操作调用 Expression.Call 时,它会抛出一个错误,指出 'System.Boolean' 无法转换为 'System.Void'

更具体地说: 我正在实现一个“等待”关键字,它只会在指定的 EventWaitHandle 上调用 WaitOne(),我对返回类型不感兴趣,因为它应该无限期地等待。

我尝试过 Expression.Convert(expression, typeof(void)),但它并没有真正做任何有趣的事情。

编辑:我找到了一个解决方案:将表达式放在一个块中。不知道为什么它有任何影响。

【问题讨论】:

    标签: c# .net linq expression


    【解决方案1】:

    从描述看来,您正在尝试创建一个Expression<Action>。 但是,WaitOne 方法具有签名 bool WaitOne(),因此生成的表达式试图返回 bool

    通过将表达式包装在一个块中,您创建了一个没有返回值的小型 thunk 方法 (void)。


    例如给出以下代码:

    bool WaitOne() { return true; }
    Action a = WaitOne;
    

    编译器不能直接为WaitOne 创建Action 类型的委托,因为这会使堆栈失衡; IE。 WaitOne 的返回值需要从堆栈中移除。

    所以为了帮助你编译器默默地创建一个方法,因此实际编译的内容类似于:

    bool WaitOne() { return true; }
    void k_CompilerGenerated() { WaitOne(); }
    Action a = k_CompilerGenerated;
    

    当你自己构建表达式时,你没有编译器为你做这件事的奢侈。所以本质上,当您创建块时,您手动执行编译器通常会执行的相同步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多