无法修改列表中的struct?

时间:2013-05-21 20:34:26

标签: c#

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

  

无法修改'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;

4 个答案:

答案 0 :(得分:11)

您已将AccountContainer声明为struct。所以

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

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

AccountList[0].Money = 547885;

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

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

答案 1 :(得分:10)

您正在使用evil可变结构。

将其更改为班级,一切都会正常。

答案 2 :(得分:1)

以下是我为您的方案解决问题的方法(使用不可变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);

答案 3 :(得分:0)

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

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