考虑这段代码:
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中的陈述?
答案 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