【问题标题】:How can I make this lambda work?我怎样才能使这个 lambda 工作?
【发布时间】:2009-12-05 16:19:48
【问题描述】:

我有这个代码:

        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 行。我怎样才能使这项工作,我做错了什么?

【问题讨论】:

    标签: c# .net lambda


    【解决方案1】:

    由于 lambda 表达式没有类型,因此出现“无法将 lambda 表达式转换为类型 'System.Delegate',因为它不是委托类型”错误。编译器通常从赋值的目标推断类型,但这对于Invoke 是不可能的,因为它需要System.Delegate。转换 lambda 表达式将解决这个问题。

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

    将您的 Invoke 行更改为以下内容,它应该可以工作:

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

    确保您引用了上述行的 System.Core 程序集,否则您将收到错误消息“使用泛型类型 'System.Action' 需要 '1' 类型参数”。

    【讨论】:

      【解决方案2】:
      this.Invoke(new Action(() => txtForm.Rtf = temp))
      

      【讨论】:

      • 从未见过这样使用的语法:p 不确定我是否喜欢。
      • new Action(() => ...) 语法在生成的 IL 方面与 (Action)(() => ...) 相同。
      【解决方案3】:
      this.Invoke((Action) () => txtForm.Rtf = something); // where something is free
      

      【讨论】:

      • 这不太行。我发现lamba实际上可以访问当前范围变量,所以传递它 temp 是不必要的。修正你的答案,我会把它标记为正确的
      • 好点 :) 显然,必须传递一些参数:p
      • 不,你必须使用 temp,而不是 'something' 东西不在这两个范围内,因此必须通过。
      • 为了使强制转换起作用,需要在 lambda 表达式周围加上一组额外的括号。
      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 2018-01-21
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多