Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Func<;int,bool>;在Linq中没有return关键字?_C#_Linq_Lambda - Fatal编程技术网

C# Func<;int,bool>;在Linq中没有return关键字?

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

在使用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 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; }