C# 是否可以在C中通过引用foreach来迭代int数组#

C# 是否可以在C中通过引用foreach来迭代int数组#,c#,C#,可以在C#foreach循环中通过引用迭代int数组吗 我的意思是这样的: int[] tab = new int[5]; foreach (ref int i in tab) { i=5; } 谢谢 可以在C#foreach中通过引用迭代int数组吗 环路 否,foreachC#中的循环不是为了对其迭代的集合进行更改而设计的。它使用了一个不能用作赋值目标的只读局部变量 您仍然可以使用for循环来执行此操作: var list = new List<MyClass>

可以在C#foreach循环中通过引用迭代int数组吗

我的意思是这样的:

 int[] tab = new int[5];
 foreach (ref int i in tab)
 {
     i=5;
 }
谢谢

可以在C#foreach中通过引用迭代int数组吗 环路

否,
foreach
C#中的循环不是为了对其迭代的集合进行更改而设计的。它使用了一个不能用作赋值目标的
只读
局部变量

您仍然可以使用
for
循环来执行此操作:

var list = new List<MyClass>();

for(var i = 0; i < list.Count; i++)
{
   list[i] = new MyClass();
}

否,
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]);
}

几乎可以肯定的是,有更好的方法来完成您想要做的事情,而不需要实际使用循环变量作为引用的循环。

是的,这可能与问题中提出的语法完全相同

从Microsoft文档:从C#7.3开始,如果枚举器的当前属性返回引用返回值(ref T,其中T是集合元素的类型),则可以使用ref或ref readonly修饰符声明迭代变量

例如:

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
由于C#7.3,它可以工作,但需要将数组转换为一个跨度

int[]tab=newint[5];
foreach(tab.AsSpan()中的ref int i){
i=5;
}
Console.WriteLine(tab.Sum());//25

在Net Core 3.1和Net 5上测试。

这是否编译<代码>int[]选项卡=新选项卡[5]为什么要这样做?为什么要这样做?tab[i]=5有什么问题?只需使用一个常规for循环或编写一个简单的扩展方法来返回keyValuePairy,您可能需要查看
for
循环。什么与Enumerable.Range(1,5)相冲突。选择(x=>5)。ToArray()?您是在什么样的项目中创建的?我很想使用此功能,但在.NETCore3.1类库(C#8)中,它会抛出编译错误而不是编译。显然,您需要将数组强制转换为一个跨度,以使其工作。有关示例,请参见我的答案。@Dan Windows窗体和WPF使用.NET framework 4.5
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