假设我有这个代表的声明:
private delegate UInt32 Feedback(UInt32 value);
在这里我尝试将它与lambda表达式一起使用
feedback = (Feedback)Delegate.Combine(feedback,
value => { Console.WriteLine("Lambda item = " + value); return 0; });
但我收到错误:无法将lambda表达式转换为' System.Delegate'因为它不是委托类型
但它的工作原理
feedback = (Feedback)Delegate.Combine(feedback,
new Func<UInt32, UInt32>(value => { Console.WriteLine("Lambda item = " + value); return 0; }));
我原以为C#编译器必须自己做。
答案 0 :(得分:5)
feedback = (Feedback)Delegate.Combine(feedback,
(Feedback)(value => { Console.WriteLine("Lambda item = " + value); return 0; }));
您必须明确说出lambda函数的类型,否则编译器不知道它具有什么类型。例如,请参阅http://blogs.msdn.com/b/jaredpar/archive/2007/12/14/c-lambda-type-inference.aspx
C#类型推断的一个限制是您无法使用它来推断lambda表达式的类型。例如,以下代码将无法编译
var f = () => 4;
答案 1 :(得分:3)
除非你使用它们,否则Lambda表达式在C#中没有类型。因为一个 lambda 可以转换为多个delegate
类型,所以编译器可以&#39;决定选择哪一个。而且你也没有办法确定lamda参数的类型是什么,因为你没有指定它们。
答案 2 :(得分:2)
Lambda没有类型。它可以隐式转换为兼容的委托类型。
Delegate.Combine
将Delegate
作为参数,因为Delegate
是一个没有任何签名的抽象类,所以lambda表达式无法转换为Delegate
。您只能将lambda转换为具有兼容签名的具体类型。
如果您希望编译器将lambda转换为Delegate
类型,这是一个抽象类,因此无法实例化 - 您希望编译器选择哪种具体类型?您必须指定它。
您可以像这样明确指定类型:
feedback = (Feedback)Delegate.Combine(feedback, new Feedback(value => { Console.WriteLine("Lambda item = " + value); return 0; }));
另一方面,如果你在LHS中有具体的委托类型,编译器将很乐意编译。
例如:以下是有效的c#代码。因为您说编译器需要将其转换为Feedback
委托类型。
Feedback feedback2 = value => { Console.WriteLine("Lambda item = " + value); return 0; };