C# 关于lambda表达式和委托的混淆?
学员清晰易懂C# 关于lambda表达式和委托的混淆?,c#,.net,c#-4.0,C#,.net,C# 4.0,学员清晰易懂 delegate int del(int i); 但是为什么我们可以使用 del myDelegate = x => x * x; 问题如下: 如何确保x在lambda表达式中为int类型 如何知道lambda表达式返回int 因为要得到x,你必须给它一个类型。它将检测此类型,而不是让您一遍又一遍地告诉它它是什么类型。C#编译器足够聪明,可以从上下文中隐式地找出=>左侧的x的类型。由于编译器知道您正在将lambda赋值给del类型的变量,因此它知道x是int 就返回类型
delegate int del(int i);
但是为什么我们可以使用
del myDelegate = x => x * x;
问题如下:
因为要得到x,你必须给它一个类型。它将检测此类型,而不是让您一遍又一遍地告诉它它是什么类型。C#编译器足够聪明,可以从上下文中隐式地找出
=>
左侧的x
的类型。由于编译器知道您正在将lambda赋值给del
类型的变量,因此它知道x
是int
就返回类型而言,编译器知道x
是int
,因此x*x
表达式的类型也必须是int
。编译器就是这样知道lambda的返回类型的
请注意,如果未指定myDelegate
的确切类型,则无法编译相同的代码:
// This does not compile!
var myDelegate = x => x*x;
现在让编译器确定lamdba表达式的作用。您可以使用和来创建子类 操作返回类型为void,而Func的返回类型为您指定的最后一个类型参数。您可以在这两种方式中指定其他输入
Func<in, in2, in3, output>
Func
用于返回int
var f = new Func<int, int>(x => x*x);
var f=newfunc(x=>x*x);