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.Combine
以Delegate
作为参数,由于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 参数的类型,因为您没有指定它们。
假设我有这个代表的声明:
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.Combine
以Delegate
作为参数,由于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 参数的类型,因为您没有指定它们。