2014-07-16 26 views
3

雖然使用LINQ我偶然發現了下面的表達式:Func <int,bool> Linq沒有返回關鍵字?

bool biggerThan10Exists = numbers.Any(n => n > 10); 

所有的定義如下:

public static bool Any<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 

爲Func鍵的定義如下:

public delegate TResult Func<in T, out TResult>(
     T arg 
) 

所以如果任何需要Func其需要de使節要傳遞的是回報一個int,怎麼來了,我可以通過一個lambda表達式,在我看來是一個無效委託的定義,即

n => n > 10 

雖然我希望

n => return n > 10 

我很確定我明顯錯過了一些東西,但什麼?

+6

當「=>」後面的表達式就是「return」。事實上,最初你根本無法合法地在lambda體內使用'return'。 – Jon

+1

return語句不是唯一隱含的;幾乎一切都是。唯一沒有暗示的是參數名稱和方法體。這個視頻很好地解釋了它:https://www.youtube.com/watch?v=KRjeu9Thp3s&list=PLAE7FECFFFCBE1A54&index=5 –

回答

6

這種類型的lambda表達式被稱爲表達拉姆達

n => n > 10 

在表達lambda,下面的=>必須是一個表達式,並且返回類型由編譯器推斷。其中一個後果是,您無法使用表達式lambda語法來創建返回類型爲void的lambda。

還有另一種語法的lambda,稱爲語句拉姆達

n => { return n > 10; } 

這裏=>之後是包含一個或多個語句的塊;如果你想返回一個值,你必須明確地這樣做,並且也可以有一個void返回類型(不返回任何東西)。

請注意,對語句lambdas的支持僅在.NET 4.0中添加,並且通常在整個框架中比表達lambda表達式更差。許多(所有?)LINQ查詢提供程序將拒絕使用語句lambda表達式,即使它們可以簡單地寫爲等效表達式lambda。

+0

不幸的是,當嘗試n => {return n> 10; },我得到「帶有語句正文的lambda表達式不能轉換爲表達式樹」。我想這是因爲任何真正需要「表達式」而不是語句塊,但我不明白爲什麼這個限制在那裏。 – user1610325

+0

@ user1610325:沒有技術上的原因,爲什麼這個特定的lambda無法工作,但編譯器有一個全侷限制 - 它不會從語句lambdas創建表達式樹,即使在最微不足道的情況下(儘管您可以手動創建它們當然)。這實際上應該是因爲在一般情況下,您不能將語句轉換爲表達式。 – Jon

4

n > 10是一個表達式,返回一個布爾值的值。

所以n => n > 10手段,採取n如果它比10大返回true,否則返回假...

而且,這裏的回報是隱含的。你也可以寫這樣的:

n => { return n > 10; } 

這簡直是equivelant到:

n => { 
     if (n > 10) 
       return true; 
      return false; 
    };