操作<t>将值赋给变量</t>

时间:2014-06-04 03:28:37

标签: c# lambda delegates action

我有一个动作

Action<string> removeTitle = source => { source = RemoveTitle(source); };

我调用

string name = "MR JOHN DOE"
removeTitle(name);

但不会更改变量name

VS(可能是Resharper)说&#34; 分配的值不用于任何执行路径&#34;对于lambda分隔符之后的source

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

字符串是不可变的..所以你的引用是在lambda的范围内重新创建的。这是similar issue to this question

如果您想修改它,则需要通过Func<T1, T2>代理退回,但是您无法使用refout(如该问题中所述),除非你创建自己的委托类型(注意:我已经通过方法分组缩短了它):

Func<string, string> removeTitle = RemoveTitle;

// ...
name = removeTitle(name);

答案 1 :(得分:1)

您可以在name委托中捕获Action...变量,如果它在您的特定情况下有效,则更改它:

string name = "something";
Action<string> removeTitle = source => { name = RemoveTitle(source); };

removeTitle(name);

我建议按照Simon Whitehead的回答建议使用Func<string, string>,如果可能的话,因为代码不能捕获局部变量,只返回没有副作用的结果更容易推理:

Func<string,string> removeTitle = RemoveTitle;  
name = removeTitle(name);