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

Luc*_*Sam 4 c# generics

这是两个样本:

这很好用:

void Main()
{
    var list = Queryable.ProjectTo(typeof(Projection));
}

public static class QueryableExtensions
{
    public static ProjectionList<T> ProjectTo<T>(this IQueryable<T> queryable, Type projectionType)
    {
        return new ProjectionList<T>(queryable, projectionType);
    }
}
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

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

void Main()
{
    var list = Queryable.ProjectTo<Projection>();
}

public static class QueryableExtensions
{
    public static ProjectionList<T, P> ProjectTo<T, P>(this IQueryable<T> queryable)
    {
        return new ProjectionList<T, P>(queryable);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Mar*_*ell 5

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

blah.ProjectTo<?,SomeType>();
Run Code Online (Sandbox Code Playgroud)

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