在list中使用结构体的时候,怎么修改结构中的数据。
public List<structCars> lstCars = new List<structCars>();        //struct:
        public struct structCars
        {
            public bool bValid;
         }我现在想修改lstCars列表中的结构体数据?我使用lstCars[i].bValid时出现:无法修改“System.Collections.Generic.List<structCars>.this[int]”的返回值,因为MainForm.cs它不是变量

解决方案 »

  1.   

    写入整个结构体。structCars car = lstCars[3];
    car.bValid = true;
    lstCars[3] = car;
      

  2.   

    错误原因:
    分析错误:
    list将Item属性实现为[]操作,所以a[i]是执行return的,STRUCT是值类型的,当用下标操作返回时,是值拷贝操作。就是将a[i]中的struct赋给临时变量,而这个赋值过程是值拷贝,值拷贝是内存复制,所以当赋值"jhon"时,只更改临时变量,而不会改变LIST中的元素所指向的内存。C#为了避免这个问题和C#的严谨,所以在编译时作为错误处理。-----------------------------
    更多信息:
    MSDN关于C#结构的说明:C#中的结构和C++是完全不同的,C++结构和类没有明显界限,C#中结构则是完全不同的。
    structs 是值类型,而类是引用类型。对于 structs,构造函数的工作方式有一些差异。尤其是,编译器始终提供一个默认的无参数构造函数,它是不允许替换的。 类在人为定义了构造函数后,默认构造函数被替换。结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 ValueType,后者继承自 Object。