炫意html5
最早CSS3和HTML5移动技术网站之一

C# 结构类型的数组能通过索引修改结构的数据,为什么结构类型的集合却直接编译报错了

static void AAA() {
Test[] ts = new Test[1];
ts[0] = new Test(1, “a”);
ts[0].a = 123; //完全没有问题
}
static void BBB() {
List<Test> ts = new List<Test>();
ts.Add(new Test(1, “a”));
ts[0].a = 123; //直接报错,说是“无法修改xxx的返回值,因为它不是变量”
}
struct Test {
public int a;
public string b;
public Test(int a, string b) {
this.a = a;
this.b = b;
}
}
是因为数组索引直接是指向了结构的地址,然后修改地址内存中的数据不报错,而集合是通过索引器返回拷贝的结构体,修改拷贝的数据没有意义,所以微软直接给报错了吗

回答

你理解的是正确的,微软源头上直接禁止了这种操作。

解决办法:

1.改成class引用类型,这样,就成了一个对象(引用类型),就会返回在堆上的实际地址,修改也会反映到实际的对象

2.设置一个中间临时变量,然后再替换整个原来的struct值。这样实际上是替换整个struct。

炫意HTML5 » C# 结构类型的数组能通过索引修改结构的数据,为什么结构类型的集合却直接编译报错了

Java基础教程Android基础教程