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

本文关键字:方法 类型 扩展 参数 之间 | 更新日期: 2023-09-27 18:18:48

假设我定义了以下方法:

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

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

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

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

但是,直到你实际转换成Func<int, int>方法组,你不能调用任何实例方法,因为它没有。当您显式地将其强制转换为Func<int, int>时,则将该表达式从方法组(本身不是Func<int, int>)更改为Func<int, int>