C# Func<;int,bool>;在Linq中没有return关键字?
在使用Linq时,我偶然发现了以下表达式:C# Func<;int,bool>;在Linq中没有return关键字?,c#,linq,lambda,C#,Linq,Lambda,在使用Linq时,我偶然发现了以下表达式: bool biggerThan10Exists = numbers.Any(n => n > 10); 任何的定义如下: public static bool Any<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate ) public delegate TResult Func<in
bool biggerThan10Exists = numbers.Any(n => n > 10);
任何的定义如下:
public static bool Any<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
public delegate TResult Func<in T, out TResult>(
T arg
)
当我期待的时候
n => return n > 10
我很确定我显然遗漏了一些东西,但是什么呢?
n>10
是一个返回布尔值的表达式
所以n=>n>10
意味着,取n
,如果大于10则返回true,否则返回false
这里的回报也是隐含的。你也可以这样写:
n => { return n > 10; }
这完全等同于:
n => {
if (n > 10)
return true;
return false;
};
这种类型的lambda表达式称为表达式lambda: 在表达式lambdas中,后面的
=>
必须是表达式,并且返回类型由编译器推断。其中一个后果是不能使用表达式lambda语法创建返回类型为void
的lambda
lambda还有另一种语法,称为语句lambda:
这里=>
后面是包含一个或多个语句的块;如果要返回一个值,必须显式返回,还可以使用void
返回类型(不返回任何内容)
请注意,对语句lambda的支持仅在.NET 4.0中添加,在整个框架中通常比对表达式lambda的支持更差,例如,许多(全部?)LINQ查询提供程序将拒绝使用语句lambda,即使它们可以简单地写成等价的表达式lambda。返回当
=>
后面的内容是一个表达式时,表示。事实上,最初您根本不能在lambda的主体中合法地使用return
;几乎每件事都是如此。唯一没有暗示的是参数名和方法体。这个视频很好地解释了这一点:不幸的是,当尝试n=>{return n>10;}时,我得到了“带有语句体的lambda表达式无法转换为表达式树”。我想这是因为任何语言都需要“表达式”而不是语句块,但我不太明白为什么会有这种限制。@user1610325:没有技术上的原因说明这个特定的lambda不能工作,但编译器有一个全面的限制——它不会从语句lambda创建表达式树,即使在最简单的情况下(当然,您可以手动创建它们)。这实际上是应该的,因为在一般情况下,不能将语句转换为表达式。
n => {
if (n > 10)
return true;
return false;
};
n => n > 10
n => { return n > 10; }