我有以下代码:我得到的错误就像"运营商".不能应用于'void'类型的操作数.是否有人可以解释原因并修改代码?
void Main()
{
Claims.AsEnumerable().Select((claim, no) => Populate(claim, no)).ToList().ForEach(Modify).Dump();;
}
public Func<Claim, int, string> Populate = (claim, no) =>
{
return "#" + no.ToString() + " " + claim.Applicant.FirstName + " " + claim.Applicant.LastName;
};
public Action<string> Modify = p =>
{
p = p + "!!!";
};
Run Code Online (Sandbox Code Playgroud)
这就是问题:
....ForEach(Modify).Dump
Run Code Online (Sandbox Code Playgroud)
ForEach回报void.您可以将其重写为:
var list = Claims.AsEnumerable()
.Select((claim, no) => Populate(claim, no))
.ToList();
list.ForEach(Modify);
list.Dump();
Run Code Online (Sandbox Code Playgroud)
但是,你会发现你实际上并没有真正修改列表 - 代码会Modify()更改参数值,但这不会改变列表中的内容.列表中的每个值(每个字符串引用)依次传递给操作.该值将复制到参数中,然后您更改参数值...但该值未连接到列表.这不是真正与LINQ相关的 - 它是简单的C#.例如:
string x = "hello";
Modify(x);
Console.WriteLine(x); // hello
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅有关参数传递的文章.
一般而言,LINQ鼓励您不要尝试进行就地修改.更改Modify为Func<string, string>使用更简洁Select- 无需列表:
Claims.AsEnumerable()
.Select((claim, no) => Populate(claim, no))
.Select(Modify)
.Dump();
...
public Func<string, string> Modify = p =>
{
p = p + "!!!";
return p;
};
Run Code Online (Sandbox Code Playgroud)
或者更简单地说Modify:
public Func<string, string> Modify = p => p + "!!!";
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我也强烈反对你不使用公共领域,但这在某种程度上是旁边的.)