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 ""; }
}
为什么标记的行不能编译?它是否与返回类型不是签名的一部分有关?
但是第三行确实可以编译,这让我猜编译器把它变成了类似于第二行的东西…
基本上,当涉及到方法组转换时,规范第7.5.2节中描述的类型推断过程相对弱。在带注释的标准中,在讨论输出类型推断(包括方法组)的7.5.2.6节中,Vladimir Reshetnikov做了一个注释:
此步骤[方法组输出类型推断]仅在委托参数类型中出现的所有方法类型参数已经固定时才适用。重载解析不会尝试根据不完整的类型信息选择最佳方法。
我相信这就是这里的问题所在——当然,你实际上只有一个可以调用的方法,而且方法组只包含一个方法,但是类型推断过程还不够强大,无法将这两个方法联系在一起。