方法和扩展方法参数之间的类型推断差异
本文关键字:方法 类型 扩展 参数 之间 | 更新日期: 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>
。