【问题标题】:Func<int,bool> without return keyword in Linq?在 Linq 中没有返回关键字的 Func<int,bool>?
【发布时间】:2014-07-16 14:19:26
【问题描述】:

在使用 Linq 时,我偶然发现了以下表达式:

bool biggerThan10Exists = numbers.Any(n => n > 10);

Any 的定义如下:

public static bool Any<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

Func 的定义如下:

public delegate TResult Func<in T, out TResult>(
        T arg
)

因此,如果 Any 需要一个 Func,它需要传递 返回 int 的委托,我怎么能传递一个 lambda 表达式在我看来是 void 委托的定义,即

n => n > 10

虽然我期待

n => return n > 10

我很确定我显然在这里遗漏了一些东西,但是什么?

【问题讨论】:

  • =&gt; 后面的内容是一个表达式时,暗示了“返回”。事实上,最初你根本不能在 lambda 的主体中合法地使用 return
  • return 语句不是唯一隐含的;几乎一切都是。唯一没有暗示的是参数名称和方法体。这个视频解释得很好:youtube.com/…

标签: c# linq lambda


【解决方案1】:

这种类型的 lambda 表达式称为 表达式 lambda

n => n > 10

在表达式 lambda 中,=&gt; 后面的内容必须是表达式,并且返回类型由编译器推断。后果之一是您不能使用表达式 lambda 语法来创建返回类型为 void 的 lambda。

还有另一种 lambda 语法,称为 statement lambda

n => { return n > 10; }

这里=&gt;后面是一个包含一个或多个语句的块;如果你想返回一个值,你必须明确地这样做,也可以有一个 void 返回类型(不要返回任何东西)。

请注意,仅在 .NET 4.0 中添加了对语句 lambda 的支持,并且通常在整个框架中比对表达式 lambda 的支持更差,例如许多(全部?)LINQ 查询提供程序将拒绝使用语句 lambda,即使它们可以简单地写成等效的表达式 lambda。

【讨论】:

  • 不幸的是,当尝试 n => { return n > 10; },我得到“不能将带有语句体的 lambda 表达式转换为表达式树”。我猜那是因为 Any 确实需要“表达式”而不是语句块,但我不太明白为什么会有这个限制。
  • @user1610325:这个特定的 lambda 无法工作没有技术原因,但编译器有一个全面的限制——即使在最微不足道的情况下,它也不会从语句 lambda 创建表达式树(尽管您当然可以手动创建它们)。这确实是应该的,因为在一般情况下,您不能将语句转换为表达式。
【解决方案2】:

n &gt; 10 是一个返回 boolean 值的表达式。

所以n =&gt; n &gt; 10的意思是,取n,如果大于10则返回true,否则返回false...

这里的返回也是隐式的。你也可以这样写:

n => { return n > 10; }

这完全等同于:

n => {   
         if (n > 10) 
              return true;
          return false;
     };

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多