调用lambda表达式而不将其分配给委托



在javascript中我们可以像这样创建一个箭头函数:

let square= (a) => a * a;

并像这样直接调用let:

square(1, 2); 

是否有一个解决方案来做类似的事情使用c# ?我试过了,但它给了我这个错误(委托类型无法推断)

var square = (x) => x * x;

您需要使用Func类型声明委托(这里的方法是一个函数,就像在JavaScript中一样)以使用lambda语法:

Func<int, int> square = value => value * value;

正如@DmitryBychenko在他的回答中指出的那样,我们需要指定一个类型而不是使用var,因为c#是一种强类型的OOP编译语言,而不是像JavaScript那样进行松散类型的解释。

因此我们可以叫它:

int result = square(2); 

但是在最新版本的c#中,编译器发出警告,使用局部方法代替:

int square(int value) => value * value;

Lambda语法不是一种类型,而是一种语言语法:我们不能">调用Lambda"因为除非调用方法本身,否则不能直接调用方法中的某一行代码。

委托和Func/Action以及实例和局部方法都是类型:因此我们调用方法

例如,本地方法和Func委托lambda风格完全相同:

int square(int value)
{
return value * value;
}

本地委托或func/action风格(匿名方法)与本地方法之间有一点区别。

发送匿名函数与发送带有Delegate参数的另一个函数的Func/Action之间的区别?

本地函数与Lambda c# 7.0

解析c# 7中的局部函数

var square = (x) => x * x;

是编译器不能从正确的值推断出square类型。可以是

Func<int, int> square = (x) => x * x;
Func<int, double> square = (x) => x * x;
Func<double, double> square = (x) => x * x;
...
// if some MyType implements * operator
Func<MyType, MyType> square = (x) => x * x;
这就是为什么你必须手动提供所需的类型,例如
// We square integer (not double, not decimal) values:
// we take int and return int 
Func<int, int> square = (x) => x * x;

最新更新