You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:50:32