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