C#, не получается присвоить значение полю объекту (вместо значения - null)

Я начал разработку простой игры на C# Windows Forms (.NET Framework 4.7.2). Столкнулся с проблемой присвоения значения полю. Для удобства выделил проблему и перенес на отдельный проект (чтобы не нагружать никого лишним кодом).

Есть 3 локации, у каждой свой NPC (неигровой персонаж, бот) записанный как поле класса GameLocation ввиде объекта класса NPC.

namespace GameProject
{
    class NPC
    {
        //NPC type
        public bool sex_male;

        //NPC constructor
        public NPC(bool isMale)
        {
            sex_male = isMale;
        }
    }
}
namespace GameProject
{
    class GameLocation
    {
        //Location number
        public int LocationNumber;
        //Location's NPC
        public NPC npc_1;

        public GameLocation(NPC ncp, int num)
        {
            npc_1 = ncp;
            LocationNumber = num;
        }
    }
}

Также я создал класс GameDefault, в котором я храню "дефолтные" экземпляры (объекты) NPC и локаций.

namespace GameProject
{
    //This class contains object of default game content, like locations and NPC
    class GameDefault
    {
        /*Default game locations (in this case Locationnumber doesn't matter, it has the meaning only for modding,
        to put additional locations in the correct order*/
        public static GameLocation loc_start_obj = new GameLocation(null, 0);
        public static GameLocation loc_survival_obj = new GameLocation( survivorm_obj, 1);
        public static GameLocation loc_village_obj = new GameLocation(villagerm_obj, 2);
        
        //Default game NPC types (of each group)
        public static NPC survivorm_obj = new NPC(true);
        public static NPC villagerm_obj = new NPC(true);
    }
}

Как видите, у локации loc_start_obj объектов NPC быть не должно, поэтому аргумент в конструкторе null, а у loc_survival_obj и loc_village_obj они присутствуют и параметры в конструкторе есть. Но после запуска программы у всех локаций поле npc_1 равно null.

Вот форма которая продемонстрирует результат:

namespace GameProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = (GameDefault.loc_survival_obj.npc_1 == null).ToString();
        }
    }
}

Программа выводит true при проверки поля npc_1 на null, хотя значение было присвоино через конструктор для этой локации.

Я попробовал убрать параметр NPC из конструктора GameLocation, и присвоил значение полю npc_1 через класс (то есть теперь для всех объектов GameLocation).

class GameLocation
    {
        //Location number
        public int LocationNumber;
        //Location's NPC
        public NPC npc_1 = GameDefault.survivorm_obj;

        public GameLocation(int num)
        {
            LocationNumber = num;
        }
    }

Результат тот же - при запуске и во время работы программи (с использованием label1.Refresh) поле равно null. Почему?

Присвоить значение получилось лишь так:

public NPC npc_1 = new NPC(true);

Результат проверки - false (то есть npc_1 не равно null). Или тоже самое через конструктор:

public GameLocation(int num, NPC ncp)
        {
            npc_1 = ncp;
            LocationNumber = num;
        }
public static GameLocation loc_start_obj = new GameLocation(0, new NPC(true));
        public static GameLocation loc_survival_obj = new GameLocation(1, new NPC(true));
        public static GameLocation loc_village_obj = new GameLocation(2, new NPC(true));

А вот так тоже не выходит, все равно null:

public NPC npc_1 = new NPC(true);
public static GameLocation loc_start_obj = new GameLocation(0, survivorm_obj);
        public static GameLocation loc_survival_obj = new GameLocation(1, survivorm_obj);
        public static GameLocation loc_village_obj = new GameLocation(2, survivorm_obj);

Почему не получается присвоить полю npc_1 значение уже существующего объекта? В чем ошибка?


Ответы (1 шт):

Автор решения: Igor
    public static NPC survivorm_obj = new NPC(true);
    public static NPC villagerm_obj = new NPC(true);

    public static GameLocation loc_start_obj = new GameLocation(null, 0);
    public static GameLocation loc_survival_obj = new GameLocation( survivorm_obj, 1);
    public static GameLocation loc_village_obj = new GameLocation(villagerm_obj, 2);
    
→ Ссылка