15

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

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

4 回答 4

19

您已声明AccountContainerstruct. 所以

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

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

AccountList[0].Money = 547885;

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

解决方案:不要创建 mutable structs。创建一个不可变的struct(即创建后不能更改的)或创建一个class.

于 2013-05-21T20:39:37.330 回答
12

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

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

于 2013-05-21T20:38:37.050 回答
0

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

AccountList.RemoveAt(0);
AccountList.Add(new AccountContainer("Michael", 54, 3, 547885));
于 2013-05-21T21:09:48.223 回答
0

这是我为您的场景解决它的方法(使用不可变struct方法,而不是将其更改为 a 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);
于 2013-05-21T21:14:20.030 回答