c#通过传递委托来推断泛型类型

本文关键字:泛型类型 | 更新日期: 2023-09-27 18:08:31

我有以下代码:

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 ""; }
}

为什么标记的行不能编译?它是否与返回类型不是签名的一部分有关?
但是第三行确实可以编译,这让我猜编译器把它变成了类似于第二行的东西…

c#通过传递委托来推断泛型类型

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

此步骤[方法组输出类型推断]仅在委托参数类型中出现的所有方法类型参数已经固定时才适用。重载解析不会尝试根据不完整的类型信息选择最佳方法。

我相信这就是这里的问题所在——当然,你实际上只有一个可以调用的方法,而且方法组只包含一个方法,但是类型推断过程还不够强大,无法将这两个方法联系在一起。