C#扩展通用约束或类型coersion不能解决更复杂的类型

时间:2018-02-06 07:18:12

标签: c# linq generics task type-inference

鉴于以下扩展名:

    public static async Task<IEnumerable<TResult>> Select<TSource, TResult>(
        this Task<IEnumerable<TSource>> source, Func<TSource, TResult> selector)
        => (await source).Select(selector);

我希望类型推断接受IEnumerable<TResult>的任何子类型,但正如我发现的那样,这不起作用。它无法推断出类型。

然后,如果我尝试重写类型参数,如下所示:

    public static async Task<IEnumerable<TResult>> Select<T, TSource, TResult>(
        this Task<T> source, Func<TSource, TResult> selector)
        where T: IEnumerable<TSource>
        => (await source).Select(selector);

以上认识到任务的使用。选择(fn)但它抱怨它不能推断出类型。

这里有什么帮助吗?我真的希望这个工作:

https://github.com/electricessence/Open.Linq.AsyncExtensions/blob/master/Open.Linq.AsyncExtensions/Extensions.cs#L3169-L3172

1 个答案:

答案 0 :(得分:0)

https://www.nuget.org/packages/Open.Linq.AsyncExtensions/1.1.1

我提出的解决类型推断/特异性问题的解决方案是包含一组.AsEnumerable()扩展,其中包含List<T>T[],{{1}等常见案例},Dictionary<TKey,TValue>

只要签名为Queue<T>,扩展程序就可以。