据我了解,我可以使用它:
Func<string> f1 = () => DateTime.Now.ToString();
作为简写:
Func<string> f2 = () => { return DateTime.Now.ToString(); };
我的问题是为什么我不能用表达式做同样的事情:
Expression<Func<string>> exp1 = () => DateTime.Now.ToString();
Expression<Func<string>> exp2 = () => { return DateTime.Now.ToString(); };
第二行无法编译。
答案 0 :(得分:3)
编译器以不同的方式处理这些对象。 第一个将编译为一个没有任何内容的IL方法,并返回DateTime.Now.ToString()。编译器本身会跳过返回并将其作为
string myMethod() { return DateTime.Now.ToString(); }
第二个生成LinqExpression对象,它以另一种方式处理它,因此这种语法会导致错误。 虽然它们第一次看起来相同,但编译器会为它们生成不同的代码。
您可以阅读Why would you use Expression<Func<T>> rather than Func<T>?关于这两种结构之间的差异
答案 1 :(得分:1)
Expressions<>
不能为语句生成,只能生成表达式。在表达式周围放置大括号时,它就变成了一个语句/复合语句。