当您希望将lambda表达式视为表达式树并查看其内部而不是执行它们时。例如,LINQ to SQL获取表达式并将其转换为等效的SQL语句并将其提交给服务器(而不是执行lambda)。
从概念上讲,Expression<Func<T>>是Func<T>的完全不同的。Func<T>表示delegate,它基本上是一个指向方法的指针,Expression<Func<T>>表示lambda表达式的树形数据结构。这个树结构描述lambda表达式的作用,而不是做实际的事情。它基本上保存了关于表达式、变量、方法调用等组合的数据。(例如,它包含这样的信息:this lambda is some constant + some parameter)。您可以使用此描述将其转换为实际的方法(使用Expression.Compile)或使用它执行其他操作(如LINQ to SQL示例)。将lambdas视为匿名方法和表达式树的行为纯粹是编译时的事情。
Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }