是否可以在C#foreach循环中通过引用迭代int数组?
我的意思是这样的:
int[] tab = new int[5];
foreach (ref int i in tab)
{
i=5;
}
感谢
答案 0 :(得分:1)
是否可以通过C#foreach中的引用迭代int数组 循环?
不,C#中的foreach
循环不是为了对它迭代的集合进行更改。它使用readonly
局部变量,不能用作分配目标。
仍然可以使用for
循环来执行此操作:
var list = new List<MyClass>();
for(var i = 0; i < list.Count; i++)
{
list[i] = new MyClass();
}
或者使用LINQ:
list = list.Select(e => new MyClass()).ToList(); // note that this will create a copy of list
答案 1 :(得分:1)
从 C# 7.3 开始,它可以工作,但您需要将数组转换为 Span。
int[] tab = new int[5];
foreach (ref int i in tab.AsSpan()) {
i = 5;
}
Console.WriteLine(tab.Sum()); // 25
在 Net Core 3.1 和 Net 5 上测试。
答案 2 :(得分:0)
不,foreach
循环不允许循环变量引用另一个变量。它总是将值复制出序列并转换为新变量。为了做你想要做的事情,你需要使用foreach
循环以外的一些结构。虽然技术上你可以编写自己的ForEach
方法接受lambda,其中参数是对数组中项目的引用,结果......可能不值得。
public delegate void ReferenceAction<T>(ref T param);
public static void ForEach<T>(T[] source, ReferenceAction<T> action)
{
for (int i = 0; i < source.Length; i++)
action(ref source[i]);
}
int[] tab = new int[5];
ForEach(tab, (ref int n) => n = 5);
几乎可以肯定,在没有实际循环变量作为参考的循环的情况下,有更好的方法来完成你尝试做的事情。
答案 3 :(得分:0)
是的,这可能与问题中提出的语法完全相同。
从Microsoft文档:从C#7.3开始,如果枚举数的Current属性返回参考返回值(ref T,其中T是集合元素的类型),则可以使用ref或ref readonly修饰符声明迭代变量。
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/foreach-in
示例:
int val = 0;
int[] tab = new int[5];
foreach (ref int i in tab) {
i = val++;
}
foreach (ref readonly var j in tab) {
Console.WriteLine(j);
}
输出:
0
1
2
3
4