为什么c#中的lambdas似乎以不同的方式处理布尔返回值?

时间:2012-07-11 15:46:20

标签: c# lambda

考虑这段代码:

Func<int, bool> TestGreaterThanOne = delegate(int a) {
                 if (a > 1) return (true);
                 else return(false);
                 };

在上面的代码中,我无法删除&#34;否则返回(false)&#34; statement - 编译器警告并非所有代码路径都返回一个值。但是在下面的代码中,它使用了lambda ...

Func<int, bool> TestGreaterThanOne = a => a > 1;

我没有&#34;否则&#34;语句 - 没有编译器警告,逻辑按预期工作。

这里有什么机制让我没有&#34;否则&#34;我的lambda中的陈述?

5 个答案:

答案 0 :(得分:21)

因为在你的lambda速记中,也没有if语句。你的lambda速记相当于

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
             return (a > 1);
             }; 

因此,所有代码路径都返回一个值。

答案 1 :(得分:2)

要稍微添加其他响应,在lambda语句中,a > 1计算为布尔值,然后返回。

通常,编写return true;return false;语句被认为是多余的。只返回表达式计算的内容就更简单了。

答案 2 :(得分:1)

作为重写委托的替代方法,你的lambda抽象等同于

Func<int, bool> TestGreaterThanOne = a => {
             if (a > 1) return (true);
             else return(false);
             };

你也无法删除else分支。因为它也不会返回。当前版本有效,因为a > 1是一个布尔值(始终存在)。

答案 3 :(得分:0)

我不认为他们在你提到的情况下会以不同的方式处理布尔值。代码只是做了两件事。由于您将Func定义为Func<int, bool>,因此需要布尔返回值。第二段代码总是返回一个布尔值。但是,除非包含else,否则第一段代码不会返回布尔值。

答案 4 :(得分:0)

a>1本身就是一个布尔值,这就是你的lambda工作的原因。你几乎可以把if语句想象成一个带有布尔参数的函数,所以,你可以做类似

的事情
boolean b = true

if(b)
    doSomething();

它将编译并执行doSomething