Expression.Call缺少重载

时间:2014-10-25 21:30:00

标签: c# overloading expression-trees

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

同时,调用带有一个参数的 static 方法会出现重载。

public static MethodCallExpression Call(MethodInfo method, Expression arg0)

遗失的版本是否被忽视,或者是否存在一些不明显的理由不存在?

2 个答案:

答案 0 :(得分:2)

看了class,我认为这似乎极其可疑。所有的调用都经过了很好的优化,除了Expression.Call(instance, methhodInfo, expression),正如你所说的那样解析为params Expression[]的重载,这没有任何意义 - 为什么没有进行优化,或者为什么有一堆{首先是{1}}类?

但是,存在静态过载的原因很充分。 Visual Basic正在共享静态重载(如链接中所示),并且VisualBasic不直接支持InstanceCallExpression2/3/4/5,不要误解我的意思,你仍然可以访问没有params[]的函数,但是以一种尴尬的方式:

Expression.Call(methodInfo, Expression f1)

答案 1 :(得分:0)

我没有设计C#,所以我无法肯定地说。但我怀疑它是因为这样的重载对于现有的Call(Expression, MethodInfo, params Expression[])重载是不明确的。

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