lambda表达式,C中的匿名函数代表#
问题描述:
-
是否需要使用委托关键字输入所有匿名函数?例如,我们有一个Customer类,lambda表达式,C中的匿名函数代表#
delegate(Customer a) {return a.name == "Michael";}
这是匿名函数
(Customer a)
{return a.name == "Michael";}
一个函数或委托或两者兼而有之?
-
做所有lambda表达式还默认谓词委托?例如,我们有客户的名单,这是listCustomers,如果我们想用TrueForAll函数来查看所有客户是否叫“迈克尔”,我们只需键入如下:
listCustomers.TrueForAll(x => x.name == "Michael);
但TrueForAll需要谓语参数,因为我们知道Predacate为代表,这意味着“X => x.name ==‘迈克尔’也是谓词代表默认
答
形式匿名委托的:
// 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();
第二码块不是匿名函数。事实上,这不是什么 - 代码不会编译。 – Abion47
对于问题#2,lambda表达式没有类型,但如果可以推断出委托类型,则它可以隐式转换为委托。在这种情况下,委托类型为'Func'。 –