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

时间:2014-07-16 14:19:26

标签: c# linq lambda

使用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
)

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

n => n > 10

虽然我希望

n => return n > 10

我很确定我在这里显然错过了什么,但是什么?

2 个答案:

答案 0 :(得分:6)

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

n => n > 10

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

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

n => { return n > 10; }

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

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

答案 1 :(得分:4)

n > 10是一个返回布尔值值的表达式。

所以n => n > 10表示,如果n大于10,则返回true,否则返回false ...

此处的回报也是隐含的。您也可以这样写:

n => { return n > 10; }

这对于:

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