Почему значение не хочет меняться? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть часть кода для хранения игровых переменных.

Структура Var является простой:

struct Var{
/// <summary>
/// Name of variable. Unchangable
/// </summary>
public string Name { get; private set; }
/// <summary>
/// Value of variable. Can be changed via <see cref="Change(string)"/>.
/// </summary>
public string Value { get; private set; }

public Var(string s, string value) {
    this.Name = s;
    this.Value = value;
}


public void Change(string v) {
    new Debug("b", $@"Changing value from ""{Value}"" to ""{v}""", Debug.Importance.ERROR);
    this.Value = v;
    new Debug("b", $@"Result: ""{Value}""", Debug.Importance.ERROR);
}
}

(new Debug(string, string, Debug.Importance) - это функция, которая просто вызывает Conosle.WriteLine() без using System в каждом файле)

class GameVars - это список из них.

Я использую индексатор для получения Var с использованием переменной.

public string this[string s] {
    get => vars.Find(e => e.Name == s).Value;
    set {
        new Debug("a", $@"Attempt to change value of ""{s}"" to ""{value}"".", Debug.Importance.ERROR);
        if( vars.Find(e => e.Name == s).Name != null )
            vars.Find(e => e.Name == s).Change(value);
        else
            vars.Add(new Var(s, value));
        new Debug("a", $@"Result: ""{this[s]}""", Debug.Importance.ERROR);
    }
}

И когда в GameVars.LoadFromFile(string s) я использую

this[ident] = value;

new Debug("", $"When do i Fire? {this[ident]}", Debug.Importance.ERROR);

if( this[ident] != value )
    throw new System.Exception("Could not change value!");

, я получаю следующий вывод:

[ERROR]( a ) Attempt to change value of "version" to "beta 0.0.0.1".
[ERROR]( b ) Changing value from "beta 0.0.0..1" to "beta 0.0.0.1"
[ERROR]( b ) Result: "beta 0.0.0.1"
[ERROR]( a ) Result: "beta 0.0.0..1"
[ERROR](  ) When do i Fire? beta 0.0.0..1
Exception thrown: 'System.Exception' in ITW.exe
An unhandled exception of type 'System.Exception' occurred in ITW.exe
Could not change value!

Почему значение не меняется?

Я пытался изменить все на публику, и ничего не помогло.Я проверил все с Console.WriteLine() и нет ничего, что могло бы переопределить это значениеОн просто не меняется на новый.

Минимальный исполняемый код на Rextester

1 Ответ

1 голос
/ 04 мая 2019

@ wimh понял:

.Find(), используемый со структурами, возвращает копию и не меняет оригинал. Fiddle

Спасибо

Код, который это исправил, но Var все еще оставался структурой:

vars[vars.FindIndex(e => e.Name == s)] = new Var(s, value);

вместо

vars.Find(e=>e.Name==s).Change(value);

И я избавился от Var.Change, так как он больше не был полезен.

...