编写一个接受lambda表达式的方法

Sha*_*bie 25 c# lambda

我有一个带有以下签名的方法:

 void MyMethod(Delegate d){};
 void MyMethod(Expression exp){};
 void MyMethod(object obj){};
Run Code Online (Sandbox Code Playgroud)

但是,这无法编译:

MyMethod((int a) => a)
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

"Cannot convert lambda expression to type 'object' because it is not a delegate type"
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

编辑:我知道这有效.在我想这种情况下,编译器将lambda表达式编译为delgate.

void MyMethod(Func<int, int> d){};
Run Code Online (Sandbox Code Playgroud)

亲切的问候,

Max*_*erl 20

因为System.Delegate类型不是"委托".它只是基类.您必须使用具有正确签名的委托类型.定义您的方法如下:

void MyMethod(Func<int, int> objFunc)
Run Code Online (Sandbox Code Playgroud)

编辑:

MyMethod(对象)不起作用,因为lambda表达式没有自己的类型,但是类型是从它所分配的位置类型推断出来的.所以对象也不起作用.您必须使用具有正确签名的委托类型.


小智 14

void MyMethod(Action<int> lambdaHereLol)
{
    lambdaHereLol(2);
}
Run Code Online (Sandbox Code Playgroud)

正在使用:

var hurrDurr = 5;
MyMethod(x => Console.Write(x * hurrDurr));
Run Code Online (Sandbox Code Playgroud)

C#是一种静态类型语言.编译器需要知道它处理的所有内容的类型.Lambdas有点难以确定,有时编译器无法弄明白.在我上面的例子中,如果MyMethod接受了一个对象,编译器就无法弄清楚它x是一个int(我的例子很简单,但是没有任何东西说它不会复杂得多,也很难确定).所以我必须更明确地定义采用我的lambda的方法.