C#中修改List内结构体成员报错原因及替代方案验证
C#结构体列表修改问题解答
替代方案有效性
你给出的替代方案完全正确。代码逻辑如下:
Emitter em = Emitters[EmitterToBootload[EmitterToBootloadIndex]]; em.FW_Version = fw; Emitters[EmitterToBootload[EmitterToBootloadIndex]] = em;
先从Emitters列表中取出对应位置的结构体副本,修改副本的FW_Version属性后,再将修改后的副本重新赋值回列表的原位置——这是C#中修改值类型列表元素属性的标准正确做法。
原代码报错原因
C#里struct属于值类型,当通过List<Emitter>[索引]获取元素时,返回的是该结构体的临时副本,而非对列表中原始元素的引用。
原代码Emitters[EmitterToBootload[EmitterToBootloadIndex]].FW_Version = fw;试图直接修改这个临时副本的属性,但这个副本是无变量指向的临时值,修改它既不会影响列表中的原始元素,C#编译器也不允许这种对临时值的直接修改操作,因此会抛出指定错误。
可选优化方案
如果想简化操作,可以将Emitter从struct改为class(引用类型)。引用类型通过列表索引获取的是原对象的引用,直接修改属性就能同步更新列表中的对象,无需重新赋值回列表。
内容的提问来源于stack exchange,提问作者GabrielT
相关产品推荐
相关产品推荐

