gpt4 book ai didi

c# - 方法和扩展方法参数之间的类型推断差异

转载 作者:太空狗 更新时间:2023-10-29 23:13:42 25 4
gpt4 key购买 nike

假设我定义了以下方法:

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

我假设当您将一个方法作为参数传递给另一个方法时会发生一些“魔法”,并且编译器因此能够猜测它应该尝试转换 ReturnNumberFunc<int, int> ,而编译器不会为扩展方法做任何这样的事情。这样对吗?我的问题可以概括为:为什么不能在方法上调用扩展方法,而可以在委托(delegate)实例上调用扩展方法?这是否与编译器不将方法视为对象而仅将委托(delegate)视为对象有关?

最佳答案

该方法组可以隐式转换Func<int, int> ,这意味着如果您在 Func<int, int> 所在的位置使用该方法组是预期的(例如通过将其传递给参数为 Func<int, int> 的方法,然后它能够​​将其转换为这样的委托(delegate)。

但是直到您真正将该方法组转换为 Func<int, int>你不能在它上面调用任何实例方法,因为它没有。当您将其显式转换为 Func<int, int> 时然后你将该表达式从方法组(它本身不是 Func<int, int> )更改为 Func<int, int> .

关于c# - 方法和扩展方法参数之间的类型推断差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33287329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com