2013-04-30 80 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; 
};