2016-12-29 114 views
0
  1. 是否需要使用委托关键字输入所有匿名函数?例如,我们有一个Customer类,lambda表达式,C中的匿名函数代表#

    delegate(Customer a) 
    {return a.name == "Michael";} 
    

这是匿名函数

(Customer a) 
    {return a.name == "Michael";} 

一个函数或委托或两者兼而有之?

  1. 做所有lambda表达式还默认谓词委托?例如,我们有客户的名单,这是listCustomers,如果我们想用TrueForAll函数来查看所有客户是否叫“迈克尔”,我们只需键入如下:

    listCustomers.TrueForAll(x => x.name == "Michael); 
    

但TrueForAll需要谓语参数,因为我们知道Predacate为代表,这意味着“X => x.name ==‘迈克尔’也是谓词代表默认

+0

第二码块不是匿名函数。事实上,这不是什么 - 代码不会编译。 – Abion47

+0

对于问题#2,lambda表达式没有类型,但如果可以推断出委托类型,则它可以隐式转换为委托。在这种情况下,委托类型为'Func '。 –

回答

2

形式匿名委托的:

// A: C# 2.0... No one uses it in new developments since years 
delegate() { } 

// B: C# 3.0 and above 
() => { } 

w ^我可以设置一个匿名代表给特定的代表吗?

Action a1 =() => Console.WriteLine("hello world"); 
Action<int> a2 = number => Console.WriteLine(number); 
Func<bool> f1 =() => true; 

这就是所谓的委托类型推断

总之,如果任务的右侧满足左侧签名(即委托类型),右侧将作为左侧的类型进行导入。方法参数也是如此。

在另一方面,它不是比lambda语法委托相同lambda表达式:

Expression<Action> expr1 =() => Console.WriteLine("hello world"); 
Action a1 =() => Console.WriteLine("hello world"); 

首先是an expression tree,这是一个数据结构类似于可以用于抽象语法树从epxression和它的孩子中提取信息,而后者是一个代表。

表达式树可被编译为代表:

Action a2 = expr1.Compile(); 
a2(); 

进一步阅读