表达式.调用缺少重载

本文关键字:重载 调用 表达式 | 更新日期: 2023-09-27 18:27:46

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

同时,还有一个重载来调用带有一个参数的static方法。

public static MethodCallExpression Call(MethodInfo method, Expression arg0)

是遗漏的版本被忽视了,还是有一些模糊的原因导致它不在那里?

表达式.调用缺少重载

看了类的外观,在我看来,它似乎非常可疑。所有的调用都经过了非常严格的优化,除了Expression.Call(instance, methhodInfo, expression),正如你所说,它解决了params Expression[]的过载,这毫无意义——为什么它没有得到优化,或者为什么一开始就有一堆InstanceCallExpression2/3/4/5类?

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

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

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

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