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在lambda表达式中为int类型
  • 如何知道lambda表达式返回int

  • 因为要得到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);