2013-04-30 24 views
1

如果我翻譯這個匿名方法:翻譯匿名方法到lambda表達式

Func<int, int> f = delegate(int i) 
{ 
    return i + 1; 
}; 

爲lambda表達式,它會是這樣的:

Func<int, int> f = i => i + 1; 

(我知道:這lambda表達式會偷偷生成另一個匿名方法(由編譯器),但這不是重點)。

現在我想下面的方法轉化爲lambda表達式:

Func<int, int> f = delegate(int i) 
{ 
    Debug.WriteLine("Inside the function!"); 
    return i + 1; 
}; 

有沒有辦法,我如何做到這一點?

+2

你說的「lambda表達式會偷偷產生另一個anymous方法」是什麼意思?這不是真的......(在IL中將會產生一個方法* * lambda表達式*或*匿名方法,但它不像lambda表達式被轉換成匿名方法,然後按正常方式編譯。) – 2013-04-30 10:02:19

+0

@Jon:就我所知,lambda表達式僅在類型「f」是「表達式」時創建。在這種情況下,'f'是一個委託,這迫使編譯創建一個可惡的方法,不是嗎? – 2013-04-30 10:14:34

+1

不,你很困惑。 'i => i + 1' *是一個lambda表達式。 lambda表達式和匿名方法都是* source level *構造,並且都可以轉換爲委託類型。另外,lambda表達式可以轉換爲表達式樹。 – 2013-04-30 10:15:37

回答

6

Lambda表達式可以包含多行,在這種情況下,語法類似於從C#2.0匿名委託:

Func<int, int> f = i => 
{ 
    Debug.WriteLine("Inside the function!"); 
    return i + 1; 
};