4

据我了解,我可以使用它:

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(); };

第二行不编译。

4

2 回答 2

3

编译器以不同的方式处理这些对象。第一个将编译为 IL 方法,该方法一无所获并返回 DateTime.Now.ToString()。编译器本身会跳过返回并将其设为

string myMethod() { return DateTime.Now.ToString(); }

第二个被生成到 LinqExpression 对象中,该对象以另一种方式处理它,因此这种语法会导致错误。虽然它们第一次看起来相同,但编译器会为它们生成不同的代码。

您可以阅读为什么要使用 Expression<Func<T>> 而不是 Func<T>?关于这两种结构的区别

于 2013-03-20T14:32:34.490 回答
1

Expressions<>s 不能为语句生成,只能为表达式生成。将大括号括在表达式周围的那一刻,它就变成了语句/复合语句。

于 2013-03-20T14:32:35.247 回答