我正在尝试调试以下代码,但它无法正常工作。
我上传这张照片 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)
答案 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) 超载期待代表。细节不值得扩大 在这里 - 只是想让你知道!