这纯粹是一个学术问题。我注意到.NET 4.5中的Expression.Call
提供了many overloads,但它们都不允许传递实例,MethodInfo
和一个单个参数。在这种情况下,必须使用params Expression[]
或IEnumerable<Expression>
的重载。
同时,调用带有一个参数的 static 方法会出现重载。
public static MethodCallExpression Call(MethodInfo method, Expression arg0)
遗失的版本是否被忽视,或者是否存在一些不明显的理由不存在?
答案 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[])
重载是不明确的。
也就是说,编译器对此有明确的重载决策规则,但它仍然可能被认为是最终用户的混淆。