C# 无法修改循环中结构的对象

C# 无法修改循环中结构的对象,c#,collections,C#,Collections,我有一个结构列表。在循环中,我试图修改对象的属性,这正在发生,但当我(Visual studio中的快速查看)查看列表对象时,新值没有反映出来。这是因为在集合中无法修改结构的对象吗? 如果您使用的是foreach循环,那么我将使用泛型列表,并将结构作为列表中的类型 错误消息无法修改的成员 “变量”,因为它是“只读” 变量类型' 当您尝试 修改变量的成员,该变量为 只读,因为它处于特殊状态 构造 出现这种情况的一个常见区域是 在foreach循环中。这是一个 修改值的编译时错误 集合元素的名称。

我有一个结构列表。在循环中,我试图修改对象的属性,这正在发生,但当我(Visual studio中的快速查看)查看列表对象时,新值没有反映出来。这是因为在集合中无法修改结构的对象吗?
如果您使用的是foreach循环,那么我将使用泛型列表,并将结构作为列表中的类型

错误消息无法修改的成员 “变量”,因为它是“只读” 变量类型'

当您尝试 修改变量的成员,该变量为 只读,因为它处于特殊状态 构造

出现这种情况的一个常见区域是 在foreach循环中。这是一个 修改值的编译时错误 集合元素的名称。所以,, 您不能对其进行任何修改 是值类型的元素, 包括结构。

不过你可以试试

struct MyStruct
{
    public int i;
}

List<MyStruct> list = new List<MyStruct> 
        { new MyStruct { i = 1 }, new MyStruct { i = 2 } };

for(int i = 0; i < list.Count; i++)
{
    MyStruct val = list[i];
    val.i++;
    list[i] = val;
}
struct MyStruct
{
公共国际一级;
}
列表=新列表
{newmystruct{i=1},newmystruct{i=2};
for(int i=0;i
编辑

另见

结构与类

结构可能类似于类, 但也有重要的区别 你应该知道的。第一 所有,类都是引用类型和 结构是值类型


我想我知道可能是什么问题

struct Astruct
{
   int amember;
}

List < Astruct > listofStructs;

foreach(Astruct A in listofStructs)
{
     A.amember = 1337;
}
struct结构
{
国际成员;
}
列表listofStructs;
foreach(结构列表中的结构A)
{
A.A成员=1337;
}
如果这就是你正在做的

在c#中使用结构时,它们不会被引用,而是被复制!这意味着列表的内容将被复制到,所以当您更改A时,它不会更改列表中的值

要解决此问题(如果这是您的问题…),请使用类而不是结构,这样A将成为引用,或者使用手动迭代for循环,即:

for(int i=0;i < listofStructs.Count;i++)
{
    listofStructs[i].amember = 1337;
}
for(int i=0;i

或者,如果您使用的是列表,您可能应该使用迭代器或其他东西。。。但是上面的内容肯定会解决这个问题。

根据您文章中的信息(尽管我希望看到代码本身),让我提出最可能的问题及其解决方案

   foreach(var s in listOfStructs)
    {
      s.Property = x;
    }
s被分配给集合中实际结构的副本。s、 set_属性现在正在修改在当前迭代结束时丢弃的副本

这是因为两个值类型变量不能指向同一实例

struct1 = new MyStruct(100, 200);
struct2 = struct1;   // struct2 is now a copy of struct1
现在转到如何修改集合中的实例的问题:
在局部变量中获取要修改的对象(已创建副本)。修改它。现在移除原始对象并插入副本。使用
listOfStructs[i]=modifiedInstance

您在结构的上下文中提到“修改对象的属性”,但重要的是,结构不是对象。其他人已经回答了复制结构(并放弃更改)的问题,但更进一步说,这里真正的问题是您有一个可变(可变)结构。除非您使用XNA(或类似产品),否则根本没有必要

如果希望能够更改属性,请将其设置为类:

public class Foo {
    public string Bar {get;set;}
}
这现在是一个引用类型,您的更改(
obj.Bar=“abc”
)将通过foreach保留。如果您确实想要/需要结构,请将其设置为不可变:

public struct Foo {
    private readonly string bar;
    public string Bar { get {return bar; }}
    public Foo(string bar) {this.bar = bar;}
}
现在,您不能犯更改副本值的错误;相反,您必须使用索引器交换值(
list[i]=newfoo(“abc”);
)。更详细(并且您不能使用
foreach
),但正确


但是在我看来,使用一个类。老实说,结构非常罕见。如果您不确定:class.

记住结构是值类型,那么您如何在循环中迭代?大拇指朝下。出现以下编译错误错误10无法修改“System.Collections.Generic.List.this[int]”的返回值,因为它不是一个变量D:\Designer\u Tag\Designer\Animation\Animation persistence.cs 182 29 Animation谢谢,我也做了同样的操作,但这不是在列表中创建了一个scstruct对象的副本吗???否,这将用复制的结构替换列表中位置i处的结构,该结构具有更新的值。+1为此,感谢Marc,在我在搜索中搜索了关于结构的内容后,下面将显示更多信息