Linq中没有return关键字的Func <int,bool>?

use*_*325 3 c# linq lambda

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

bool biggerThan10Exists = numbers.Any(n => n > 10);
Run Code Online (Sandbox Code Playgroud)

Any的定义如下:

public static bool Any<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)
Run Code Online (Sandbox Code Playgroud)

Func的定义如下:

public delegate TResult Func<in T, out TResult>(
        T arg
)
Run Code Online (Sandbox Code Playgroud)

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

n => n > 10
Run Code Online (Sandbox Code Playgroud)

虽然我期待

n => return n > 10
Run Code Online (Sandbox Code Playgroud)

我很确定我明显错过了什么,但是什么?

Jon*_*Jon 6

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

n => n > 10
Run Code Online (Sandbox Code Playgroud)

在表达式lambdas中,后面的内容=>必须是一个表达式,返回类型由编译器推断.其中一个后果是您无法使用表达式lambda语法来创建具有void返回类型的lambda .

lambda有另一种语法,称为语句lambda:

n => { return n > 10; }
Run Code Online (Sandbox Code Playgroud)

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

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