我有一个动作
Action<string> removeTitle = source => { source = RemoveTitle(source); };
我调用
string name = "MR JOHN DOE"
removeTitle(name);
但不会更改变量name
VS(可能是Resharper)说&#34; 分配的值不用于任何执行路径&#34;对于lambda分隔符之后的source
。
我在这里做错了什么?
答案 0 :(得分:4)
字符串是不可变的..所以你的引用是在lambda的范围内重新创建的。这是similar issue to this question。
如果您想修改它,则需要通过Func<T1, T2>
代理退回,但是您无法使用ref
或out
(如该问题中所述),除非你创建自己的委托类型(注意:我已经通过方法分组缩短了它):
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);