我们说我定义了以下方法:
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>
,而编译器不会为扩展方法做任何这样的事情。它是否正确?我的问题可以概括为:为什么你不能在方法上调用扩展方法,而你可以在委托实例上调用扩展方法?它是否与编译器不将方法视为对象这一事实有关,而只是将委托视为对象?
答案 0 :(得分:5)
该方法组可以隐式转换到Func<int, int>
,这意味着如果您在预期Func<int, int>
的位置使用该方法组(例如将它传递给参数为Func<int, int>
的方法,然后它就可以将其转换为这样的委托。
但是在你真正将该方法组转换为Func<int, int>
之前,你无法在其上调用任何实例方法,因为它没有。当您明确地将其转换为Func<int, int>
时,您将该表达式从方法组(本身不是Func<int, int>
)更改为Func<int, int>
。