我正在尝试编写一个函数,该函数将函数作为其参数之一 - 我以前做过很多次的任务。这很好用:
int RunFunction(Func<int,int> f, int input) {
return f(input);
}
int Double(int x) {
return x*2;
}
// somewhere else in code
RunFunction(Double,5);
然而这不起作用:
public static class FunctionyStuff {
public static int RunFunction(this Func<int,int> f, int input) {
return f(input);
}
}
// somewhere else in code
Double.RunFunction(5);
知道为什么第一个有效,第二个没有?
答案 0 :(得分:5)
第一个版本正在执行方法组转换,作为“参数参数”匹配的一部分。扩展方法不会发生此转换。对于lambda表达式也是如此 - 你不能写:
((int x) = > x * 2).RunFunction(10);
或者
C#4规范的第7.6.5.2节提供了扩展方法调用的详细信息。它首先要求方法调用是以下形式之一:
expr.identifier ( )
expr.identifier ( args )
expr.identifier < typeargs > ( )
expr.identifier < typeargs > ( args )
然后在此规则中使用表达式(expr
)的类型:
扩展方法C i .M j 符合条件如果
- [...]
- 从 expr 到M j 的第一个参数的类型存在隐式标识,引用或装箱转换。
该规范的注释版本包括Eric Lippert的评论:
此规则可确保制作扩展
double
的方法不会扩展int
。它还确保在匿名函数或方法组上没有定义扩展方法。
答案 1 :(得分:0)
Extension Methods“被称为扩展类型的实例方法”。
在您的情况下,Double
不是实例,因此您无法在其上调用扩展方法。