智商与数不清.扩展方法



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

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

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

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

我相信

答案是它像你描述的那样工作得很好。 这是我的小 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

如果您可以提供更具体的示例,那么也许我们可以发现导致问题的东西。

最新更新