方法和扩展方法参数之间的类型推断差异

时间:2015-10-22 17:45:49

标签: c# extension-methods

我们说我定义了以下方法:

int ReturnNumber(int number)
{
    return number;
}

现在,让我们说我也定义了以下两种方法;常规方法:

void Print(Func<int, int> function)

和扩展方法:

static void Print(this Func<int, int> function)

我可以这样称呼前者:

Print(ReturnNumber); // Regular method call, seems to implicitly convert ReturnNumber to Func<int, int>

但我无法用后者做到这一点:

ReturnNumber.Print(); // Extension method call, does not seem to do the implicit conversion -- results in compiler error

虽然我可以这样做:

((Func<int, int>)ReturnNumber).Print(); // I perform the conversion explicitly

我假设有一些&#34;魔法&#34;将方法作为参数传递给另一个方法时发生的情况,并且编译器因此能够猜测它应该尝试将ReturnNumber转换为Func<int, int>,而编译器不会为扩展方法做任何这样的事情。它是否正确?我的问题可以概括为:为什么你不能在方法上调用扩展方法,而你可以在委托实例上调用扩展方法?它是否与编译器不将方法视为对象这一事实有关,而只是将委托视为对象?

1 个答案:

答案 0 :(得分:5)

该方法组可以隐式转换Func<int, int>,这意味着如果您在预期Func<int, int>的位置使用该方法组(例如将它传递给参数为Func<int, int>的方法,然后它就可以将其转换为这样的委托。

但是在你真正将该方法组转换为Func<int, int>之前,你无法在其上调用任何实例方法,因为它没有。当您明确地将其转换为Func<int, int>时,您将该表达式从方法组(本身不是Func<int, int>)更改为Func<int, int>