ラムダ式は匿名メソッドであり、内部ではデリゲートであるため、次のようなことができます。
delegate bool Foo(int x);
Foo bar = x => x == 1;
このデリゲートをEnumerable
拡張メソッドに渡すことは、完全に理にかなっています。一般的に期待される引数は aFunc
であり、これはデリゲートの省略形です。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
Queryable
ただし、次のような拡張メソッドにデリゲートを渡す方法については不明です。
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
このメソッドはExpression<TDelegate>
引数を必要としますが、ラムダ式を渡すことは完全に合法です。ラムダ式をExpression<TDelegate>
消費できるように強制するメカニズムは何ですか?
Queryable メソッドがプロバイダーによる解析用の式ツリーを構築するという事実はよく知っていますが、すぐにはわからないこの 1 つの側面にただ興味があります。
アップデート
私は自分の無知についてますます無知になってきています。ラムダ式はデリゲートではありませんが、デリゲートまたは式の作成に使用できます。
Expression<Func<int, bool>> foo = c => c == 1;
コンパイラはコンテキストに基づいて型を推測しますか? これは合法ではないので、そうでなければならないと思います:
var foo = c => c == 1;