C#:当有多个类型参数时,为什么generics类型推断不起作用?

这是两个样本:

这很好用:

void Main() { var list = Queryable.ProjectTo(typeof(Projection)); } public static class QueryableExtensions { public static ProjectionList ProjectTo(this IQueryable queryable, Type projectionType) { return new ProjectionList(queryable, projectionType); } } 

这会引发以下错误:

使用generics方法’QueryableExtensions.ProjectTo(System.Linq.IQueryable)’需要2个类型参数

 void Main() { var list = Queryable.ProjectTo(); } public static class QueryableExtensions { public static ProjectionList ProjectTo(this IQueryable queryable) { return new ProjectionList(queryable); } } 

当然第一个例子需要1个类型参数,但是编译器可以弄清楚它是什么,所以我不需要提供任何参数。 第二个例子需要2个类型的参数,但编译器知道什么是T,那为什么它不仅需要一个无法推断的?

为了记录我在我的代码中使用第一个例子就好了,但我更喜欢第二个的语法更好,并且可能存在我希望具有投影的generics类型的情况。 有没有办法实现这一点,还是我咆哮错误的树?

谢谢!

问题不是2个参数,而是从哪里推断它? 通用参数推断仅查看参数,特别是不考虑返回类型。 参数中没有任何内容可以表明P.要求generics类型推断提供所有这些,或者所有这些都明确指定。 有趣的是,曾经有人提到过“mumble-typing”,正如我所解释的那样(因为它从未完全定义过)会让你像你想要的那样混合搭配。 想像:

 blah.ProjectTo(); 

(确切的语法无关紧要,因为这个语言特征不存在) – 但它意味着“有2个genericmtype参数;你(编译器)找出第一个参数;第二个是SomeType”。

这是因为通用参数推断仅适用于输入参数。 在第二个示例中, P参数仅出现在返回类型中,因此推理不起作用。 所以当你写:

 var list = Queryable.ProjectTo(); 

TProjection但对你来说P是什么?

但即使你写道:

 ProjectionList list = Queryable.ProjectTo(); 

它仍然行不通。