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,SomeType>();
(确切的语法无关紧要,因为这个语言特征不存在) – 但它意味着“有2个genericmtype参数;你(编译器)找出第一个参数;第二个是SomeType”。
这是因为通用参数推断仅适用于输入参数。 在第二个示例中, P
参数仅出现在返回类型中,因此推理不起作用。 所以当你写:
var list = Queryable.ProjectTo();
T
是Projection
但对你来说P
是什么?
但即使你写道:
ProjectionList list = Queryable.ProjectTo();
它仍然行不通。