[英]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
我假设当您将一个方法作为参数传递给另一个方法时,会发生一些“魔术”,因此编译器可以猜测它应该尝试将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>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.