无法修改列表中的结构

本文关键字:结构 列表 修改 | 更新日期: 2023-09-27 18:14:36

我想更改列表中的货币价值,但总是收到错误消息:

无法修改"System.Collections.Generic.List.this[int]"的返回值,因为它不是变量

怎么了?如何更改值?

struct AccountContainer
{
    public string Name;
    public int Age;
    public int Children;
    public int Money;
    public AccountContainer(string name, int age, int children, int money)
        : this()
    {
        this.Name = name;
        this.Age = age;
        this.Children = children;
        this.Money = money;
    }
}
List<AccountContainer> AccountList = new List<AccountContainer>();
AccountList.Add(new AccountContainer("Michael", 54, 3, 512913));
AccountList[0].Money = 547885;

无法修改列表中的结构

您已将AccountContainer声明为struct。所以

AccountList.Add(new AccountContainer("Michael", 54, 3, 512913));

创建 AccountContainer 的新实例,并将该实例的副本添加到列表中;以及

AccountList[0].Money = 547885;

检索列表中第一项的副本,更改副本的Money字段并放弃该副本 - 列表中的第一项保持不变。由于这显然不是您的意图,因此编译器会警告您。

解决方案:不要创建可变struct s. 创建一个不可变的struct(即,一个在创建后无法更改的(或创建一个class

你正在使用一个邪恶的可变结构。

将其更改为类,一切都会正常工作。

可能不推荐,但它解决了问题:

AccountList.RemoveAt(0);
AccountList.Add(new AccountContainer("Michael", 54, 3, 547885));
以下是

我为您的场景解决它的方法(使用不可变的 struct 方法,而不是将其更改为class(:

struct AccountContainer
{
    private readonly string name;
    private readonly int age;
    private readonly int children;
    private readonly int money;
    public AccountContainer(string name, int age, int children, int money)
        : this()
    {
        this.name = name;
        this.age = age;
        this.children = children;
        this.money = money;
    }
    public string Name
    {
        get
        {
            return this.name;
        }
    }
    public int Age
    {
        get
        {
            return this.age;
        }
    }
    public int Children
    {
        get
        {
            return this.children;
        }
    }
    public int Money
    {
        get
        {
            return this.money;
        }
    }
}
List<AccountContainer> AccountList = new List<AccountContainer>();
AccountList.Add(new AccountContainer("Michael", 54, 3, 512913));
AccountList[0] = new AccountContainer(
    AccountList[0].Name,
    AccountList[0].Age,
    AccountList[0].Children,
    547885);