如何调试此错误:“无法将Lambda表达式转换为字符串”

本文关键字:Lambda 无法将 表达式 转换 字符串 何调试 调试 错误 | 更新日期: 2023-09-27 18:15:56

我正在尝试调试以下代码,但它不工作。

我上传这张照片http://i68.tinypic.com/2rqoaqc.jpg

这是我的代码:

using System;
using System.Text;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {   
         string input = "code1,code2,#c55+35+97#g,coden,code3,code4,#c44+25+07#gcoden";
         string output = Regex.Replace(
             input, 
             "#c(.*?)#g", 
             m => "#c" + m.Groups[1].Value.Split('+').Sum(int.Parse) + "#");
         Console.WriteLine(output);    
    }
}

这些是我得到的错误:

错误1:

'int . parse (string)'的返回类型错误(CS0407) -

错误2:

调用在以下方法或属性之间是二义性的:'System.Linq.Enumerable.Sum(System.Collections.Generic。’和‘System.Linq.Enumerable.Sum(System.Collections.Generic. general .)’。IEnumerable, System.Func)' (CS0121)

错误3: -无法将m "lambda"转换为字符串

无法将lambda表达式转换为类型"字符串",因为它不是委托类型(CS1660)

如何调试此错误:“无法将Lambda表达式转换为字符串”

您需要使用显式lambda而不是int.Parse():

    string output = Regex.Replace(
        input,
        "#c(.*?)#g",
        m => "#c" + m.Groups[1].Value.Split('+').Sum(v => int.Parse(v)) + "#");

注意我用v => int.Parse(v)代替了int.Parse。示例小提琴。

有趣的是,这在c# 6.0中编译和工作如预期:

    string output = Regex.Replace(
        input,
        "#c(.*?)#g",
        m => "#c" + m.Groups[1].Value.Split('+').Sum(int.Parse) + "#");

样品罗斯林小提琴。我不确定这个变化是在哪里记录的,也许在c# 6的新语言特性下:改进的重载解析:

对重载解析有一些小的改进可能会导致更多的事情按照你期望的方式工作他们。这些改进都与"更好"有关,也就是编译器决定两个重载中哪一个更适合给定的论点。

您可能会注意到这个(或者不再注意到)的地方问题!)是在重载之间选择可空值的时候类型。另一个是当传递方法组时(与lambdas相反)重载期望委托。细节不值得赘述在这里-只是想让你知道!