功能的功能是一个方向,而不是另一个方向

时间:2012-03-18 00:10:57

标签: c# functional-programming

我正在尝试编写一个函数,该函数将函数作为其参数之一 - 我以前做过很多次的任务。这很好用:

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);

知道为什么第一个有效,第二个没有?

2 个答案:

答案 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不是实例,因此您无法在其上调用扩展方法。