【问题标题】:Expression.Call missing overloadExpression.Call 缺少重载
【发布时间】:2014-10-25 21:30:00
【问题描述】:

这纯粹是一个学术问题。我注意到 .NET 4.5 中的 Expression.Call 提供了 many overloads 但它们都不允许传递实例、MethodInfoone 单个参数。在这种情况下,必须使用 params Expression[]IEnumerable<Expression> 的重载。

同时,调用带有一个参数的静态方法有一个重载。

public static MethodCallExpression Call(MethodInfo method, Expression arg0)

丢失的版本是被忽略了还是有一些不为人知的原因导致它不存在?

【问题讨论】:

    标签: c# overloading expression-trees


    【解决方案1】:

    看了class 的样子,我觉得这很可疑。所有的调用都经过了相当大的优化,除了Expression.Call(instance, methhodInfo, expression) 解决了params Expression[] 的重载,正如你所说,这是没有意义的 - 为什么没有被优化,或者为什么有一堆InstanceCallExpression2/3/4/5 类第一名?

    但是,存在静态过载是有充分理由的。 Visual basic 正在共享该静态重载(如您的链接中所示),VisualBasic 不直接支持params[],不要误会我的意思,您仍然可以在没有Expression.Call(methodInfo, Expression f1) 的情况下访问该函数,但是很尴尬方式:

    Expression.Call(methodInfo, new[]{yourFirstArgExpr});

    【讨论】:

    • According to MSDN,VB.NET 确实支持调用 params 方法,就像 C# 一样。
    • @svick;良好的观察。这两种语言是否相互兼容?
    【解决方案2】:

    我没有设计 C#,所以我不能肯定。但我怀疑这是因为这样的重载相对于现有的Call(Expression, MethodInfo, params Expression[]) 重载是模棱两可的。

    也就是说,编译器对此有明确的重载解决规则,但它仍然可能会被最终用户认为是混乱的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2017-06-28
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多