0

说真的,我必须错过一些简单的东西。任何帮助将不胜感激。

下面是场景: 1) 创建一个名为 DoSomething 的 IQueryable 扩展方法,并带有适当的签名(IQueryable、int x、int y)。2) 创建一个名为 DoSomething 的 IEnumerable 扩展方法,使用与 IQueryable 相同的签名,除了接受/返回 IEnumerable 而不是 IQueryable。3) 在 IEnumerable 扩展方法中,将 enumerable 转换为 Queryable (AsQueryable) 并尝试调用 IQueryable.DoSomething 方法。

出于某种原因,上述方案似乎对 IEnumerable 扩展方法而不是 IQueryable 进行了递归调用。我不明白为什么。

我了解 IQueryable 扩展了 IEnumerable;但是,.NET 扩展似乎可以检测并正常工作。例如, variable.AsQueryable().Take(1) 将至少通过智能感知(和 ReSharper)调用 Queryable 扩展,而不是 Enumerable 扩展。当我自己编写时,它似乎不起作用,并创建了一个无限循环。

4

1 回答 1

0

我相信答案是它就像你描述的那样工作得很好。这是我的小 LINQPad 测试程序。诚然,这种情况比您描述的情况稍微简单一些,因为我返回 void 并且不带任何参数。

void Main()
{
    int[] numbers = { 1, 2, 3, 4, 5 };
    numbers.AsQueryable().DumpLast<int>();
    numbers.DumpLast<int>();
}

public static class TestExtensions
{
    public static void DumpLast<T>(this IQueryable<T> list)
    {
        list.Last<T>().Dump();
    }

    public static void DumpLast<T>(this IEnumerable<T> list)
    {
        list.AsQueryable().DumpLast<T>();
    }
}

输出:

5
5

如果你能提供一个更具体的例子,那么我们可能会发现一些导致问题的东西。

于 2012-05-29T22:55:44.000 回答