gpt4 book ai didi

c# - 在 C# 中,为什么我不能在 foreach 循环中修改值类型实例的成员?

转载 作者:IT王子 更新时间:2023-10-29 03:45:43 29 4
gpt4 key购买 nike

我知道值类型应该是不可变的,但这只是一个建议,不是规则,对吧?那么为什么我不能做这样的事情:

struct MyStruct
{
public string Name { get; set; }
}

public class Program
{
static void Main(string[] args)
{
MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } };
foreach (var item in array)
{
item.Name = "3";
}
//for (int i = 0; i < array.Length; i++)
//{
// array[i].Name = "3";
//}

Console.ReadLine();
}
}

代码中的 foreach 循环无法编译,而注释的 for 循环工作正常。错误信息:

Cannot modify members of 'item' because it is a 'foreach iteration variable'

这是为什么?

最佳答案

因为 foreach 使用枚举器,而枚举器不能更改基础集合,但是可以更改集合中某个对象引用的任何对象。这就是值和引用类型语义发挥作用的地方。

在一个引用类型上,也就是一个类,集合中存储的只是一个对象的引用。因此,它实际上从未接触过对象的任何成员,也不会关心它们。对对象的更改不会影响集合。

另一方面,值类型将其整个结构存储在集合中。在不更改集合并使枚举器无效的情况下,您无法访问其成员。

此外,枚举器返回集合中值的副本。在 ref 类型中,这没有任何意义。引用的副本将是相同的引用,并且您可以以任何您想要的方式更改引用的对象,并且更改会超出范围。另一方面,在值类型上,意味着您得到的只是该对象的一个​​副本,因此该副本上的任何更改都不会传播。

关于c# - 在 C# 中,为什么我不能在 foreach 循环中修改值类型实例的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650705/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com