一个 lambda 表达式是一个匿名方法,它在幕后是一个委托,所以我可以做这样的事情:
delegate bool Foo(int x);
Foo bar = x => x == 1;
将此委托传递给Enumerable
扩展方法非常有意义,因为典型的预期参数是 a Func
,它是委托的简写:
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>
参数,但传入 lambda 表达式是完全合法的。将 lambda 表达式强制转换为Expression<TDelegate>
可以被使用的机制是什么?
我熟悉 Queryable 方法构建表达式树以供提供者解析的事实,我只是对这对我来说不是立即显而易见的方面感到好奇。
更新
我对自己的无知越来越无知。Lambda 表达式不是委托,但可用于创建委托或表达式:
Expression<Func<int, bool>> foo = c => c == 1;
编译器是否根据上下文推断类型?我猜一定是这样,因为这是不合法的:
var foo = c => c == 1;