2012-08-03 99 views
0

我以Lambda表达式开始了解如何定义使用它的匿名方法。Lambda表达式中的多个句子

我有以下简单的代码:

delegate void AddNumber(int number); 
class LambdaExpressionSample 
{ 
    static void Main(string[] args) 
    { 
     AddNumber method = r => Console.WriteLine(r + r);Console.Read(); 
     method(1); 
    } 
} 

我想的是,该方法将等于这个:

AddNumber method = new AddNumber(delegate(int number) 
{ 
    Console.WriteLine(number+number); 
    Console.Read(); 
}); 

但与lambda表达式的代码无法正常工作因为lambda表达式显然以分号“;”结束在Console.WriteLine之后。

我如何使我的方法执行Console.WriteLine和Console.Read使用我的lambda示例?

+0

正如其他人已经回答,你只需要在这里一些花括号。 – 2012-08-03 08:31:24

+0

很少有必要像这里一样制作委托类型。如果你使用的是局部变量,'var'语法可能是最好的方法。对于明确的类型(例如方法参数),我会使用Func <>和Action <>类型。这里你有一个动作,因为没有返回类型,所以你会说'动作'而不是'AddNumber'。调用这个委托'AddNumber'意味着它做了什么,但是这种类型没有任何意义。我更喜欢让类型描述委托的签名,并将变量的名称赋予其含义。 – 2012-08-03 08:39:50

回答

1

你必须使用大括号,如果你有一个以上的语句

AddNumber method = r => 
{ 
    Console.WriteLine(r + r); 
    Console.Read(); 
}; 
+0

谢谢,只是仍然是“;”在} – Jose3d 2012-08-03 08:29:39

+0

是的,这只是示例如何使其工作。 – Madman 2012-08-03 08:37:25

2

你可以简单地包裹这样的大括号之间的代码:

delegate void AddNumber(int number); 
class LambdaExpressionSample 
{ 
    static void Main(string[] args) 
    { 
     AddNumber method = r => 
     { 
      Console.WriteLine(r + r); 
      Console.Read(); 
     }; 
     method(1); 
    } 
} 

Action封装,有一个方法单个参数并且不返回值。因此,为了避免在你的代码到处都是自定义的委托代理地狱,你应该使用:

Action<int> addNumber; 

代替:

delegate AddNumber(int number); 

而且这里是你的新代码的更改:

class LambdaExpressionSample 
{ 
    static Action<int> addNumber; 
    static void Main(string[] args) 
    { 
     this.addNumber = r => 
     { 
      Console.WriteLine(r + r); 
      Console.Read(); 
     }; 
     this.addNumber(1); 
    } 
} 
+0

非常感谢!! – Jose3d 2012-08-03 08:31:59

0

添加大括号用于多行代码解决您的问题

AddNumber method = r => 
       { 
         Console.WriteLine(r + r); 
         Console.Read(); 
       };