我有以下代码:
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 ""; }
}
为什么标记的行没有编译?它是否与返回类型不属于签名有关? 但是第三行确实编译了,这让我觉得编译器把它变成类似于第二行的东西......
答案 0 :(得分:7)
基本上,当涉及方法组转换时,规范7.5.2节中描述的类型推断过程相对弱。在带注释的标准中,在7.5.2.6节讨论输出类型推断 - 包括方法组 - 有一个来自Vladimir Reshetnikov的注释说明:
仅当委托参数类型中出现的所有方法类型参数都已修复时,此步骤[方法组输出类型推断]才适用。重载决策不会尝试根据不完整的类型信息选择最佳方法。
我相信这正是问题所在 - 当然,你实际上只有一个方法可以调用,而方法组只包含一个方法,但类型推断过程不够强大,无法将两者结合在一起