使用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)
我很确定我明显错过了什么,但是什么?
这种类型的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.
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |