C# 表达式。调用缺少的重载

C# 表达式。调用缺少的重载,c#,overloading,expression-trees,C#,Overloading,Expression Trees,这纯粹是一个学术问题。我注意到.NET4.5中提供了Expression.Call,但它们都不允许传递实例、MethodInfo和one单个参数。在这种情况下,必须使用带有params Expression[]或带有IEnumerable的重载 同时,有一个重载来调用静态方法,它只接受一个参数 public static MethodCallExpression Call(MethodInfo method, Expression arg0) 丢失的版本是否被忽略了,或者它不存在的原因不明?我

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

同时,有一个重载来调用静态方法,它只接受一个参数

public static MethodCallExpression Call(MethodInfo method, Expression arg0)
丢失的版本是否被忽略了,或者它不存在的原因不明?

我没有设计C,所以我不能确定。但是我怀疑这是因为这样的重载对于现有的
调用(Expression,MethodInfo,params Expression[])
重载来说是不明确的


也就是说,编译器对此有明确的重载解析规则,但最终用户仍然可能会认为它令人困惑。

看看,我认为这似乎非常可疑。除了
Expression.Call(instance,methodinfo,Expression)
之外,所有的调用都经过了非常艰苦的优化,正如您所说,它解决了
params Expression[]
的重载问题,这没有任何意义-为什么不进行优化,或者首先为什么会有一堆
InstanceCallExpression2/3/4/5

然而,静态过载的存在有一个很好的理由。VisualBasic正在共享该静态重载(如链接中所示),VisualBasic不直接支持
params[]
,请不要误会,您仍然可以在不使用
Expression.Call(methodInfo,Expression f1)
的情况下访问该函数,但方式很尴尬:


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

,VB.NET确实像C#一样支持调用
params
方法。@svick;很好的观察。这两种语言互相兼容吗?