【问题标题】:MatchEvaluator gives "Cannot use a lambda expression..." errorMatchEvaluator 给出“不能使用 lambda 表达式...”错误
【发布时间】:2017-07-09 20:44:09
【问题描述】:

我正在修改几个文件的内容。我在表单中有这个正则表达式,它直接从按钮的点击事件中调用。

public partial class MainForm : Form
{
    private void UpdateButton_Click(object sender, EventArgs e)
    {
        // code

        if (!OldURLBox.Text.IsEmpty() && !NewURLBox.Text.IsEmpty())
        {
            Regex patternURL = new Regex(string.Format("s:\\d+:\\\\\"((.(?!s:\\d+))*?){0}(.*?)\\\\\";", OldURL));
            content = patternURL.Replace(content, delegate(Match m) // works fine
            {
                var prefix = m.Groups[1].Value;
                var postfix = m.Groups[3].Value;
                var length_prefix = prefix.Replace("\\n", "$").Length;
                var length_postfix = postfix.Replace("\\n", "$").Length;
                var length_total = length_prefix + NewURL.Length + length_postfix;
                return string.Format("s:{0}:\\\"{1}{2}{3}\\\";", length_total, prefix, NewURL, postfix);
            });
        }

        // code
    }
}

这工作正常。我已将此代码(正则表达式替换)移动到另一个项目并收到以下错误:

如果不先将 lambda 表达式转换为委托或表达式树类型,则不能将其用作动态分派操作的参数

我没有直接在事件函数中调用正则表达式替换,我猜这就是导致错误的原因。我不知道如何解决它。检查以下代码。这是我正在使用的结构。省略不相关的部分。

public partial class ProgressForm : Form
{
    private void ProgressForm_Load(object sender, EventArgs e)
    {
        // when run without delay, it freezes, waits for targz extraction
        System.Timers.Timer timer = new System.Timers.Timer(500);
        timer.Elapsed += (sender2, e2) => OnTimedEvent(sender2, e2);
        timer.AutoReset = false;
        timer.Enabled = true;
    }

    private void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            if (File.Exists(Template.File.ArchiveTarGz))
            {
                // code; extract files from archive

                ModifyFiles();

                // code; repack files
            }
        });
    }

    private void ModifyFiles()
    {
        // code

        Regex patternURL = new Regex(string.Format("s:\\d+:\\\\\"((.(?!s:\\d+))*?){0}(.*?)\\\\\";", Template.Website.URL));
        DBText = patternURL.Replace(DBText, delegate(Match m) // Error: Cannot use a lambda expression as an argument ...
        {
           var prefix = m.Groups[1].Value;
           var postfix = m.Groups[3].Value;
           var length_prefix = prefix.Replace("\\n", "$").Length;
           var length_postfix = postfix.Replace("\\n", "$").Length;
           var length_total = length_prefix + UserInput.Website.URL.Length + length_postfix;
           return string.Format("s:{0}:\\\"{1}{2}{3}\\\";", length_total, prefix, UserInput.Website.URL, postfix);
        });

        // code
    }
}

这可能是重复的,因为这个确切的错误还有其他问题,但我找不到可以在我的代码中实现的东西。

有人可以将标题更改为更合适的标题。我不希望标题成为错误,因为已经存在几个问题。

【问题讨论】:

  • 天真地,你的代码应该编译得很好。但是,您忽略了函数中使用的某些成员的类型信息,这一定是您的问题的根源。

标签: c# regex lambda delegates matchevaluator


【解决方案1】:

您正在替换 DBText 的内容。 Regex.replace 需要一个字符串作为第一个参数。我猜 DBText 是动态类型的,在这种特殊情况下会使编译器感到困惑。

你可以简单地将 DbText 转换为字符串,你应该没问题

patternURL.Replace((string)DBText, (...)

【讨论】:

  • 确实,我使用的是var DBText。将其更改为string DBText 有效。我期待一些严重的错误。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多