方法组(C#In Depth) - 需要帮助更好地理解方法组是什么

pgh*_*ech 10 c#

所以我已经阅读了许多与"什么是方法组"相关的StackOverflow问题以及其他互联网文章,它们在底线都说同样的事情 - 方法组是"一组重载方法".

然而,阅读乔恩斯基特的"C#详解(第二版)",他说关于Lambda表达式的语境方法组下面的空话(章9.4.1)

更改的原因:简化泛型方法调用

类型推断在少数情况下发生.我们已经看到它适用于隐式类型数组,当您尝试将方法组隐式转换为委托类型时也需要它.当您使用方法组作为另一个方法的参数时发生转换时,这可能会特别令人困惑:调用方法的重载,方法组中方法的重载以及泛型方法涉及的可能性,这组潜在的转换可能是巨大的."

这两个方法组都不只是分配一组重载方法,或者他说你实际上可以创建一个保留整个方法组的委托.或者完全不同的东西,我不太了解.

有人能解释一下他说的可能吗?

谢谢,

Eri*_*ert 14

Jon描述的场景是这样的:

int M() {...}
string M<T>(T t) {...}
double M<T>(List<T> t) {...} 
static void M(double d) {...}
... etc ...

void N(Func<int> f) {...}
void N<T>(Action<T> a) {...}
void N<T>(Func<IEnumerable<T>> f) {...}
... etc ...

N(M);
Run Code Online (Sandbox Code Playgroud)

N和M都是方法组,可能包含许多方法,其中一些可能是通用的.编译器提出的问题是"确定哪些方法N和M是开发人员想要的方法,如果预期的方法是通用的,则计算出类型参数".

为了完成所有这一切,编译器必须尝试每个可能的N,然后找出每个可能的M中的哪个与N的重载的形式参数的委托类型兼容.它必须丢弃那些不起作用的,然后从所有那些潜在的数百或数千个组合中,找出哪一个是"最好的",如果有的话.这在语义分析中是一个棘手的问题.