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

时间:2016-11-02 01:24:53

标签: c#

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

我上传这张照片 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 int.Parse(string)'的返回类型错误(CS0407) -

错误2:

  

以下方法或属性之间的调用不明确:'System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable,System.Func)'和'System.Linq.Enumerable.Sum(System.Collections。 Generic.IEnumerable,System.Func)'(CS0121)

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

  

无法将lambda表达式转换为'string'类型,因为它不是委托类型(CS1660)

1 个答案:

答案 0 :(得分:3)

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

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

注意我已将int.Parse替换为v => int.Parse(v)。样本fiddle

有趣的是,这在c#6.0中编译并按照需要运行:

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

示例Roslyn fiddle。我不确定这个变化的记录在哪里,可能在New Language Features in C# 6: Improved overload resolution下:

  

重载分辨率有很多小的改进,其中   可能会导致更多事情按照您的预期运作   他们来。这些改进都与“更好”有关 - 就是这种方式   编译器决定给定的两个重载中的哪一个更好   参数。

     

您可能会注意到这一点(或者更确切地说停止注意到这一点   问题!)是在选择可以为空的值的重载之间   类型。另一种是传递方法组(而不是lambdas)   超载期待代表。细节不值得扩大   在这里 - 只是想让你知道!