6

考虑这段代码:

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

在上面的代码中,我无法删除“else return(false)”语句——编译器警告说并非所有代码路径都返回一个值。但是在下面的代码中,它使用了一个 lambda...

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

我不必有“else”语句 - 没有编译器警告并且逻辑按预期工作。

这里有什么机制使我的 lambda 中没有“else”语句?

4

5 回答 5

21

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

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

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

于 2012-07-11T15:47:31.897 回答
2

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

通常,写作return true;return false;陈述被认为是多余的。只返回表达式的结果更简单。

于 2012-07-11T15:50:04.550 回答
1

作为重写委托的替代方法,您的 lambda 抽象相当于

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

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

于 2012-07-11T15:53:58.180 回答
0

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

于 2012-07-11T15:50:29.740 回答
0

a>1本身是一个布尔值,这就是你的 lambda 工作的原因。您几乎可以将 if 语句视为一个接受布尔参数的函数,因此,您可以执行类似的操作

boolean b = true

if(b)
    doSomething();

它会编译并执行 doSomething

于 2012-07-11T15:51:25.420 回答