![](/img/trans.png)
[英]c# .net why does Task.Run seem to handle Func<T> differently than other code?
[英]Why do lambdas in c# seem to handle boolean return values differently?
考慮這段代碼:
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”語句?
因為在你的lambda速記中,也沒有if語句。 你的lambda速記相當於
Func<int, bool> TestGreaterThanOne = delegate(int a) {
return (a > 1);
};
因此,所有代碼路徑都返回一個值。
要稍微添加其他響應,在lambda語句中, a > 1
計算為布爾值,然后返回該布爾值。
一般來說,寫return true;
並return false;
陳述被認為是多余的。 只返回表達式求值的內容更簡單。
作為重寫委托的替代方法,你的lambda抽象等同於
Func<int, bool> TestGreaterThanOne = a => {
if (a > 1) return (true);
else return(false);
};
你無法刪除else分支的地方。 因為它也不會返回。 當前版本有效,因為a > 1
是布爾值(始終存在)。
在你提到的情況下,我認為它們不會以不同的方式處理布爾值。 代碼只是做了兩件事。 由於您將Func
定義為Func<int, bool>
因此它需要一個布爾返回值。 第二段代碼總是返回一個布爾值。 但是,除非包含else,否則第一段代碼不會返回布爾值。
a>1
本身就是一個布爾值,這就是你的lambda工作的原因。 你幾乎可以把if語句想象成一個帶有布爾參數的函數,所以你可以做類似的事情
boolean b = true
if(b)
doSomething();
它將編譯並執行doSomething
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.