如何让我的行动起作用?

Dee*_*ent 0 c#

我有以下代码:我得到的错误就像"运营商".不能应用于'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)

Jon*_*eet 7

这就是问题:

....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鼓励您不要尝试进行就地修改.更改ModifyFunc<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)

(顺便说一句,我也强烈反对你不使用公共领域,但这在某种程度上是旁边的.)

  • @leppie:它会编译,这是第一个问题.*然后*OP可以看到它不会修改列表(正如我现在在最后解释的那样) (3认同)