我有这段代码:
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线上。我怎样才能做到这一点,我做错了什么?
答案 0 :(得分:6)
“无法将lambda表达式转换为类型'System.Delegate',因为它不是委托类型”发生错误,因为lambda表达式没有类型。编译器通常会从赋值的目标中推断出类型,但Invoke
无法实现此类型,因为它需要System.Delegate
。转换lambda表达式将解决这个问题。
没有必要将temp
声明为lambda表达式的参数。该表达式将能够引用包含范围中的temp
。
将您的Invoke
行更改为以下内容,它应该有效:
this.Invoke((Action)(() => txtForm.Rtf = temp));
确保您引用上述行的System.Core
程序集,否则您将收到错误消息“使用泛型类型'System.Action'需要'1'类型参数”。
答案 1 :(得分:5)
this.Invoke(new Action(() => txtForm.Rtf = temp))
答案 2 :(得分:0)
this.Invoke((Action) () => txtForm.Rtf = something); // where something is free