C#基于传递委托来推断泛型类型

TDa*_*ver 7 c# generics delegates

我有以下代码:

public static class X
{
    public static C Test<A,B,C>(this A a, Func<B,C> f)
        where C:class
    {
        return null;
    }

}

public class Bar
{
    public Bar()
    {
        this.Test(foo); //this doesn't compile
        this.Test((Func<int, string>)foo);
        this.Test((int q) => "xxx");
    }

    string foo(int a) { return ""; }
}
Run Code Online (Sandbox Code Playgroud)

为什么标记的行不能编译?它是否与返回类型不属于签名有关?
但是第三行确实编译了,这让我觉得编译器把它变成类似于第二行的东西......

Jon*_*eet 7

基本上,当涉及方法组转换时,规范7.5.2节中描述的类型推断过程相对较弱.在带注释的标准中,在7.5.2.6节中讨论了输出类型推理 - 包括方法组 - 有一个来自Vladimir Reshetnikov的注释说明:

仅当委托参数类型中出现的所有方法类型参数都已修复时,此步骤[方法组输出类型推断]才适用.重载决策不会尝试根据不完整的类型信息选择最佳方法.

我相信这正是这里的问题 - 当然,你实际上只有一个方法可以调用,方法组只包含一个方法,但类型推断过程不够强大,无法将两者结合在一起.