方法参数和扩展方法参数之间的类型推断不一致

5

假设我定义了以下方法:

int ReturnNumber(int number)
{
    return number;
}

现在,假设我还定义了以下两个方法:一个常规方法:
void Print(Func function)
和一个扩展方法:
static void Print(this Func function)
我可以这样调用前者:
Print(ReturnNumber); // 常规方法调用,似乎会将ReturnNumber隐式转换为Func 但是我不能使用后者:
ReturnNumber.Print(); // 扩展方法调用,似乎不会进行隐式转换--导致编译错误
尽管我可以这样做:
((Func)ReturnNumber).Print(); // 我显式执行转换
我假设当您将方法作为参数传递给另一个方法时,会发生一些“魔法”,因此编译器能够猜测它应该尝试将ReturnNumber转换为Func,而编译器对扩展方法则没有这样的处理。这是正确的吗?我的问题可以概括为:为什么无法在方法上调用扩展方法,而可以在委托实例上调用扩展方法?这是否与编译器仅将委托视为对象而非方法有关?
1个回答

5
那个方法组可以被“隐式转换”为Func<int, int>,这意味着如果你在使用该方法组的位置期望一个Func<int, int>(例如将其传递给一个参数为Func<int, int>的方法),则可以将其转换为这样的委托。但在将该方法组显式转换为Func<int, int>之前,您不能调用任何实例方法,因为它没有任何实例方法。当您将其显式转换为Func<int, int>时,您将该表达式从一个方法组(它本身不是Func<int, int>)转换为Func<int, int>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接