C# 在C中更新foreach循环中的结构#

C# 在C中更新foreach循环中的结构#,c#,.net,foreach,C#,.net,Foreach,我有这个密码(C#): 但是,如果我将东西更改为类,而不是结构,它会编译 有人能解释一下发生了什么事吗 结构不是引用类型,而是值类型 如果对于对象,您将使用类而不是结构,那么foreach循环将为您创建一个引用变量,该变量将指向列表中的正确元素。但由于它是一种值类型,因此它只对对象的一个副本进行操作,在本例中,该副本就是迭代变量。或多或少,编译器不允许您更改foreach中的循环变量(部分) 只需使用: for(int i = 0; i < things.Count; i+= 1) //

我有这个密码(C#):

但是,如果我将
东西
更改为
,而不是
结构
,它会编译


有人能解释一下发生了什么事吗

结构不是引用类型,而是值类型


如果对于
对象
,您将使用
类而不是
结构
,那么foreach循环将为您创建一个引用变量,该变量将指向列表中的正确元素。但由于它是一种值类型,因此它只对
对象的一个副本进行操作,在本例中,该副本就是迭代变量。

或多或少,编译器不允许您更改foreach中的循环变量(部分)

只需使用:

for(int i = 0; i < things.Count; i+= 1) //  for each file
{
    things[i].Name = "xxx";
}
for(inti=0;i

Thing
是一个类时,它就起作用了,因为循环变量是一个引用,您只对引用的对象进行更改,而不对引用本身进行更改。

结构是一个值类型,而类是一个引用类型。这就是为什么当它是类而不是结构时它会编译


请参阅更多信息:

与@Henk的解决方案相比,我更喜欢的另一种语法是

DateTime[]dates=新的DateTime[10];
foreach(可枚举范围中的int索引(0,dates.Length))
{
参考日期时间日期=参考日期[索引];
//用日期做一些事情。
// ...
}
如果你在循环中做了相当多的工作,那么不用到处重复索引就更容易了


p.S.DateTime实际上是一个非常糟糕的例子,因为它没有任何可以设置的属性,但您可以了解情况。

是的,它是相关的。因为它是一个值类型,所以整个结构是循环变量,因此不能修改它的任何部分。非常感谢+1相关问题
Cannot modify members of 't' because it is a 'foreach iteration variable'
for(int i = 0; i < things.Count; i+= 1) //  for each file
{
    things[i].Name = "xxx";
}