我是否正确认为以下代码段不起作用(数组项未被修改),因为数组是整数,它是值类型.
class Program
{
public static void Main()
{
int[] ints = new int[] { 1,2 };
Array.ForEach(ints, new Action<int>(AddTen));
// ints is not modified
}
static void AddTen(int i)
{
i+=10;
}
}
Run Code Online (Sandbox Code Playgroud)
如果示例使用字符串数组,则可能会应用相同的结果,大概是因为字符串是不可变的.
我的问题是: -
有没有解决的办法?我无法更改回调方法的签名 - 例如通过添加ref关键字,我不想用类包装值类型 - 这将工作...
(当然,我可以简单地编写一个老式的foreach循环来执行此操作!)
您只是更改局部变量 - 而不是列表中的项目.要执行此操作,您需要ConvertAll创建新的列表/数组:
int[] ints = new int[] { 1,2 };
int[] newArr = Array.ConvertAll<int,int>(ints, AddTen);
Run Code Online (Sandbox Code Playgroud)
有:
static int AddTen(int i)
{
return i+10;
}
Run Code Online (Sandbox Code Playgroud)
这也可以用匿名方法编写:
int[] newArr = Array.ConvertAll<int,int>(ints,
delegate (int i) { return i+ 10;});
Run Code Online (Sandbox Code Playgroud)
或者在C#3.0中作为lambda:
int[] newArr = Array.ConvertAll(ints, i=>i+10);
Run Code Online (Sandbox Code Playgroud)
除此之外...一个for循环:
for(int i = 0 ; i < arr.Length ; i++) {
arr[i] = AddTen(arr[i]); // or more directly...
}
Run Code Online (Sandbox Code Playgroud)
但无论如何,你将不得不从你的方法中获得价值.除非你改变签名,否则你不能.