2013-05-21 4 views
6

Я хочу, чтобы изменить значение денег в моем списке, но я всегда получаю сообщение об ошибке:Невозможно изменить структуру в списке?

не может изменить возвращаемое значение «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; 

ответ

8

Вы указали AccountContainer как struct. Так

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

создает новый экземпляр AccountContainer и добавляет копию этого экземпляра в списке; и

AccountList[0].Money = 547885; 

получает копию первого элемента в списке, изменяет Money поле копии и отбрасывает копию – первый пункт в списке остается неизменным. Поскольку это явно не то, что вы намеревались, компилятор предупреждает вас об этом.

Не создавать изменяемые struct s. Создайте неизменяемый struct (т. Е. Тот, который не может быть изменен после его создания) или создайте class.

9

Вы используете измененную структуру evil.

Измените это на класс и все будет работать нормально.

+2

Жаль о 'Point',' Rectangle' и 'Size'. По крайней мере, Microsoft немного научилась создавать «Комплекс». Было бы очень неприятно, если бы *, что * был изменчивым. –

0

Вероятно, не рекомендуется, но это решает проблему:

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

Удаление первого элемента в списке требует перемещения всех элементов вниз по индексу, а затем добавление элемента потребует перемещения их обратно. Вместо этого вы должны просто установить значение в этом индексе: 'list [index] = new ...;' – Servy

+0

Хорошая точка - я не пытался поддерживать порядок списка. – bigtech

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); 
+0

Но 'AccountContainer' семантически представляет значение? Должна ли она быть структурой? – Servy

+0

@Servy Это отличный вопрос. Если приведенный пример изменения «Денег» - это операция, выполняемая byt, «AccountContainer», скорее всего, будет лучше обслуживаться как сущность (на языке DDD, то есть). Моя внутренняя чувствительность заключается в том, что показано, что показан меньший разрез более широкой картины, в которой могут быть даже лучшие возможности для функциональной декомпозиции данных сущности и стоимости. –

Смежные вопросы