Delegate.Combine 和 lambda 表达式

Delegate.Combine and lambda expression

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

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

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

One of the limitations of C# type inference is that you cannot use it to infer the type of a lambda expression. For example, the following code will not compile

var f = () => 4;

Lambda 没有类型。它可以隐式转换为兼容的委托类型。

Delegate.CombineDelegate作为参数,由于Delegate是一个抽象的class,没有任何签名,lambda表达式不能转换成Delegate。您只能将 lambda 转换为具有兼容签名的具体类型。

如果您希望编译器将您的 lambda 转换为 Delegate 类型,这是一个抽象 class 类型,因此无法实例化 -- 您希望编译器选择哪种具体类型?您必须指定它。

您可以像这样明确指定类型:

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; };

Lambda 表达式在 C# 中没有类型,除非你强制转换 them.It,因为一个 lambda 可以转换为多个 delegate 类型,所以编译器无法决定要 choose.And 哪个,也无法确定 lamda 参数的类型,因为您没有指定它们。