使用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
我很确定我在这里显然错过了什么,但是什么?
答案 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;
};