C#表达式语法简写

时间:2013-03-20 14:21:09

标签: c# delegates lambda

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

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

第二行无法编译。

2 个答案:

答案 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<>不能为语句生成,只能生成表达式。在表达式周围放置大括号时,它就变成了一个语句/复合语句。