Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 行动<;T>;给变量赋值_C#_Lambda_Delegates_Action - Fatal编程技术网

C# 行动<;T>;给变量赋值

C# 行动<;T>;给变量赋值,c#,lambda,delegates,action,C#,Lambda,Delegates,Action,我有一个行动 Action<string> removeTitle = source => { source = RemoveTitle(source); }; 但不更改变量名称 VS(可能是Resharper)表示,在lambda分隔符之后,源“分配的值不用于任何执行路径” 我在这里做错了什么?字符串是不可变的。。因此,您的引用正在lambda范围内重新创建。这是一个好主意 如果要修改它,需要通过Func委托返回它,但不能使用ref或out(如问题中所建议的),除非您创建自

我有一个行动

Action<string> removeTitle = source => { source = RemoveTitle(source); };
但不更改变量
名称

VS(可能是Resharper)表示,在lambda分隔符之后,
“分配的值不用于任何执行路径”


我在这里做错了什么?

字符串是不可变的。。因此,您的引用正在lambda范围内重新创建。这是一个好主意

如果要修改它,需要通过
Func
委托返回它,但不能使用
ref
out
(如问题中所建议的),除非您创建自己的委托类型(注意:我通过方法分组缩短了它):

Func removeTitle=removeTitle;
// ...
名称=删除标题(名称);

字符串是不可变的。。因此,您的引用正在lambda范围内重新创建。这是一个好主意

如果要修改它,需要通过
Func
委托返回它,但不能使用
ref
out
(如问题中所建议的),除非您创建自己的委托类型(注意:我通过方法分组缩短了它):

Func removeTitle=removeTitle;
// ...
名称=删除标题(名称);

您可以在
操作中捕获
名称
变量…
委托并更改它(如果它在您的特定上下文中工作):

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

removeTitle(name);
string name=“某物”;
Action removeTitle=source=>{name=removeTitle(source);};
删除标题(名称);
我建议按照Simon Whitehead的回答使用
Func
,如果可能的话,因为不捕获局部变量并且只返回结果而没有副作用的代码更容易推理:

Func<string,string> removeTitle = RemoveTitle;  
name = removeTitle(name);
Func removeTitle=removeTitle;
名称=删除标题(名称);

您可以在
操作中捕获
名称
变量…
委托并更改它(如果它在您的特定上下文中工作):

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

removeTitle(name);
string name=“某物”;
Action removeTitle=source=>{name=removeTitle(source);};
删除标题(名称);
我建议按照Simon Whitehead的回答使用
Func
,如果可能的话,因为不捕获局部变量并且只返回结果而没有副作用的代码更容易推理:

Func<string,string> removeTitle = RemoveTitle;  
name = removeTitle(name);
Func removeTitle=removeTitle;
名称=删除标题(名称);

当然是更好的方法,但是您可以在lambda中使用
ref
/
out
,但是您不能将其转换为代理的Func/Action系列中的代理,因为
ref
/
out
是签名的一部分。您需要定义自己的兼容委托类型。它还要求在lambda中指定所有参数类型。这就是我的意思。回到我的办公桌时会更新。谢谢你,迈克!当然是更好的方法,但是您可以在lambda中使用
ref
/
out
,但是您不能将其转换为代理的Func/Action系列中的代理,因为
ref
/
out
是签名的一部分。您需要定义自己的兼容委托类型。它还要求在lambda中指定所有参数类型。这就是我的意思。回到我的办公桌时会更新。谢谢你,迈克!