![](/img/trans.png)
[英]How to Solve this Error “Cannot convert lambda expression to type 'string' because it is not a delegate type”
[英]How can I debug this error: “Cannot Convert Lambda Expression to String”?
我正在尝试调试以下代码,但无法正常工作。
我上传了这张图片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表达式转换为“字符串”类型,因为它不是委托类型(CS1660)
您需要使用显式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的新语言功能:改进的重载分辨率下 :
对于重载分辨率有许多小的改进,这可能会导致更多的事情按照您期望的方式工作。 所有的改进都与“更好”有关–编译器决定两个重载中的哪个重载对于给定参数更好。
您可能会注意到这一点(或更确切地说,不再注意到问题!)的地方是在采用可空值类型的重载之间进行选择。 另一个是将方法组(而不是lambda)传递给期望委托的重载时。 详细信息不值得在此处进行扩展–仅想让您知道!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.