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

Call lambda expression without asigned it to a delegate

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

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

然后像这样直接调用 let :

square(1, 2); 

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

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

您需要使用 Func type to use the lambda syntax:

声明委托(这里的方法是函数,如 JavaScript)
Func<int, int> square = value => value * value;

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

因此我们可以称它为:

int result = square(2); 

但是对于最新版本的 C#,编译器会发出警告,要求改用 local method

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

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

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

例如本地方法以及 Func 委托 lambda 样式完全相同:

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

本地委托或 func/action 样式 (anonymous methods) 与本地方法之间略有不同。

Dissecting the local functions in 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;