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

Type inference discrepancy between method and extension method arguments

假设我定义了以下方法:

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

我假设当您将一个方法作为参数传递给另一个方法时会发生一些 "magic",因此编译器能够猜测它应该尝试将 ReturnNumberFunc<int, int>,而编译器不会为扩展方法做任何这样的事情。这个对吗?我的问题可以概括为:为什么不能在方法上调用扩展方法,而可以在委托实例上调用扩展方法?跟编译器不把方法当对象,只把委托当对象有关系吗?

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

但是在您将该方法组实际转换为 Func<int, int> 之前,您不能对其调用任何实例方法,因为它具有 none。当您将其显式转换为 Func<int, int> 时,您将该表达式从方法组(它本身不是 Func<int, int>)更改为 Func<int, int>.