在C#中,为什么不能在foreach循环中修改值类型实例的成员?
|
我知道值类型应该是不可变的,但这只是一个建议,而不是规则,对吗?
那么为什么我不能做这样的事情:
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循环可以正常工作。错误信息:
无法修改\'item \'的成员,因为它是\'foreach迭代变量\'
这是为什么?
没有找到相关结果
已邀请:
7 个回复
授巨
蓟类
中拥有该值的副本,而不是引用。如果允许您更改
中的值,则它不会反映在数组中的值上,因为它是一个全新的值。这就是为什么不允许这样做的原因。 如果要执行此操作,则必须按索引遍历数组,而不能使用临时变量。
漂截嘘
编辑:@崔鹏飞 如果您使用“ 5”隐式类型,则编译器很难为您提供帮助。如果您使用“ 6”,它将告诉您结构的情况,它是只读的。在类的情况下,对该项目的引用是只读的,因此您不能在循环内编写“ 7”,但可以更改其可变的属性。 您也可以使用(如果您想使用
):
死狸蔽垂藐
糕泰灌
超可林
扭湘阀柿蹄
实例。
在C#中是只读的。对于引用类型(类),这并没有太大变化,因为只有引用是只读的,因此仍然可以执行以下操作:
但是,对于值类型(结构),整个对象是只读的,这将导致您遇到的情况。您无法在foreach中调整对象。