方法和扩展方法参数之间的类型推断差异
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",因此编译器能够猜测它应该尝试将 ReturnNumber
到 Func<int, int>
,而编译器不会为扩展方法做任何这样的事情。这个对吗?我的问题可以概括为:为什么不能在方法上调用扩展方法,而可以在委托实例上调用扩展方法?跟编译器不把方法当对象,只把委托当对象有关系吗?
该方法组可以隐式转换到Func<int, int>
,这意味着如果您在 Func<int, int>
所在的位置使用该方法组预期(例如通过将其传递给参数为 Func<int, int>
的方法,然后它能够将其转换为这样的委托。
但是在您将该方法组实际转换为 Func<int, int>
之前,您不能对其调用任何实例方法,因为它具有 none。当您将其显式转换为 Func<int, int>
时,您将该表达式从方法组(它本身不是 Func<int, int>
)更改为 Func<int, int>
.
假设我定义了以下方法:
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",因此编译器能够猜测它应该尝试将 ReturnNumber
到 Func<int, int>
,而编译器不会为扩展方法做任何这样的事情。这个对吗?我的问题可以概括为:为什么不能在方法上调用扩展方法,而可以在委托实例上调用扩展方法?跟编译器不把方法当对象,只把委托当对象有关系吗?
该方法组可以隐式转换到Func<int, int>
,这意味着如果您在 Func<int, int>
所在的位置使用该方法组预期(例如通过将其传递给参数为 Func<int, int>
的方法,然后它能够将其转换为这样的委托。
但是在您将该方法组实际转换为 Func<int, int>
之前,您不能对其调用任何实例方法,因为它具有 none。当您将其显式转换为 Func<int, int>
时,您将该表达式从方法组(它本身不是 Func<int, int>
)更改为 Func<int, int>
.