0

真剣に、単純なものが欠けている必要があります。どんな助けでも大歓迎です。

シナリオは次のとおりです。1) 適切な署名 (IQueryable、int x、int y) を使用して、DoSomething という IQueryable 拡張メソッドを作成します。2) IQueryable の代わりに IEnumerable を受け入れる/返すことを除いて、IQueryable と同じ署名を使用して DoSomething と呼ばれる IEnumerable 拡張メソッドを作成します。3) IEnumerable 拡張メソッド内で、enumerable を Queryable (AsQueryable) に変換し、IQueryable.DoSomething メソッドの呼び出しを試みます。

何らかの理由で、上記のシナリオは、IQueryable ではなく IEnumerable 拡張メソッドを再帰的に呼び出しているように見えます。理由がわかりません。

IQueryable が IEnumerable を拡張することを理解しています。ただし、.NET 拡張機能は正しく検出して動作するようです。たとえば、 variable.AsQueryable().Take(1) は、少なくとも intellisense (および ReSharper) を介して、Enumerable 拡張ではなく、Queryable 拡張を呼び出します。独自のコードを作成すると、機能していないように見え、無限ループが作成されます。

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 に答える