在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;