2009-12-05 64 views
1

我有这样的代码:我如何使这个lambda工作?

 String temp = txtForm.Rtf; 

     foreach (ReplaceStrut rs in replaceArray) { 
      temp = temp.Replace(rs.getNeedle(), rs.getReplacement()); 
     } 
     if (this.InvokeRequired) { 
      this.Invoke(temp => txtForm.Rtf = temp); 
     } else { 
      txtForm.Rtf = temp; 
     } 

但它不会编译。它抱怨两件事:“不能将lambda表达式转换为类型'System.Delegate',因为它不是一个委托类型”,并且“一个名为'temp'的局部变量不能在这个范围内声明,因为它会带来不同的意义'temp',已经在'父级或当前'范围内用于表示其他内容'

这两个错误都在lambda行上。我该如何做这项工作,我做错了什么?

回答

5
this.Invoke(new Action(() => txtForm.Rtf = temp)) 
+0

从来没有见过这样的语法:p不知道如果我喜欢它。 – leppie 2009-12-05 16:31:52

+1

'new Action((=)...>)语法在生成的IL到'(Action)((=> ...>)'方面是相同的。 – 2009-12-05 16:58:49

0
this.Invoke((Action)() => txtForm.Rtf = something); // where something is free 
+1

这不起作用。我发现lamba实际上有权访问当前的作用域变量,因此传递它的temp是不必要的。修正你的答案,我将它标记为合适的一个 – Malfist 2009-12-05 16:24:45

+0

好点:)显然有些参数必须通过然后:p – leppie 2009-12-05 16:30:27

+0

不,你必须使用温度,而不是'某些东西在任何范围内,因此它必须通过。 – Malfist 2009-12-05 16:35:51

6

的“不能转换lambda表达式为类型‘System.Delegate’,因为它不是委托类型”的错误正在发生,因为lambda表达式没有类型。编译器通常会从作业的目标中推断出类型,但这不适用于Invoke,因为它需要System.Delegate。投射lambda表达式可以解决这个问题。

没有必要声明temp作为您的lambda表达式的参数。该表达式将能够从包含范围引用temp

Invoke行更改为以下,它应该工作:

this.Invoke((Action)(() => txtForm.Rtf = temp)); 

确保你引用的System.Core大会上线,否则你会得到一个错误说“使用泛型类型' System.Action'需要'1'类型参数“。

+0

+1为解释 – Davy8 2009-12-05 16:43:44