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

时间:2011-09-13 10:43:53

标签: 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 ""; }
}

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

1 个答案:

答案 0 :(得分:7)

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

  

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

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