Delegate.Combine和lambda表达式

时间:2015-02-24 08:45:02

标签: c# lambda delegates

假设我有这个代表的声明:

    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#编译器必须自己做。

3 个答案:

答案 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.CombineDelegate作为参数,因为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; };