0

メソッドから匿名型を返すことはできないことを理解しています。また、これを行うための回避策があることも理解しています。私の質問は、Linqプロバイダーはどのような方法を使用するのかということです。たとえば、(Linqプロバイダーがどのように機能するかを理解する手がかり)、Select()拡張メソッドがに適用されIQueryable、その式ツリーがLinqプロバイダーによって解析されてSQLに変換され、クエリ結果が解析されて型に読み込まれます。 ... 戻ってきた。

では、タイプを返すためにどのような手法がSelect()EntityFrameworkやNHibernateなどで使用されているのでしょうか。

4

2 に答える 2

3

ジェネリックを使用しています。コンパイラは、型の推論を通じて、匿名型の正確な型を認識します。
コンパイラは匿名型のクラスを自動的に生成することに注意してください。あとは、他の型と同じようにただの型です。

public IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> items,
                                                     Func<TSource, TResult> converter)
{
    foreach(var item in items)
        yield return converter(item);
}

メソッドから匿名型を返すことができます。問題は、匿名型の型名がわからないため、厳密に型指定できないことですが、それはコンパイラーに知られているため、ジェネリックは匿名型で機能します。

あなたが話している回避策は、ジェネリックも使用しています。

于 2012-12-06T14:51:46.817 に答える
2

ジェネリックを使用していると思われるため、戻り値の型は「匿名」のように見えますが、使用しているデータ型のために既知です。

単純な事実として、プログラムは (一度コンパイルされると) 渡された (または操作された) 型に基づいて、返される正確な型を認識します。

ジェネリックについてはこちらでさらに読むことができます。ジェネリックはコーディング時に非常に役立ちます - いつ適切に使用するかを知っている限り

于 2012-12-06T14:51:24.567 に答える