我有一个带有以下签名的方法:
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的方法.
| 归档时间: |
|
| 查看次数: |
19984 次 |
| 最近记录: |