C#使用list时,提示无法修改List<T>.this[int]的返回值,因为它不是变量

339 阅读1分钟
namespace WindowsFormsApplication1
{
    public class Pt3DClass
    {
        public int x;
        public int y;
        public int z;
        public Pt3DClass(int ix = 0, int iy = 0, int iz = 0)
        {
            x = ix;
            y = iy;
            z = iz;
        }
    }
    public struct Pt3DStruct
    {
        public int x;
        public int y;
        public int z;
        public Pt3DStruct(int ix = 0, int iy = 0, int iz = 0)
        {
            x = ix;
            y = iy;
            z = iz;
        }
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            Pt3DClass ptc = new Pt3DClass(1,2,3);
            List<Pt3DClass> lstc = new List<Pt3DClass>();
            lstc.Add(ptc);
            lstc[0].x = 999;

            Pt3DStruct pts = new Pt3DStruct(4,5,6);
            List<Pt3DStruct> lsts = new List<Pt3DStruct>();
            lsts.Add(pts);
            lsts[0].x = 666;

            InitializeComponent();
        }
    }
}

在VS中编写上述代码的时候,如图下所示,会报错:无法修改List.this[int]的返回值,因为它不是变量。
在这里插入图片描述
仔细查看上述代码,我们可以发现存放类的List可以直接给元素内的对象赋值,但存放结构体的List无法直接给元素内的对象赋值
原因:
list[i] 是继承 IList 中的方法
object this[int index] { get; set; }
在List中使用.获取对象的时候,如果List内的元素是struct,那么它其实就是一个值传递; 如果是class,它传递的是对象的地址。值传递 它返回的是一个临时拷贝,是无法更改本身的值的,所以会报错