Ваша проблема заключается в этой строке: if (Icont.islots[i].item == reci.Materials[0].item)
Поскольку элементы, которые вы сравниваете, являются ссылочными типами (я предполагаю, что они являются "классами"), то использование оператора ==
по умолчанию будет выполнять проверку на равенство ссылок (если вы не перегрузите его, что кажется, что нет).
Это означает, что ==
проверит, являются ли два элемента ссылкой на один и тот же объект в памяти. Вот почему вы видите желаемое поведение, когда они есть, и нежелательное поведение, когда один просто является клоном другого.
Существует множество способов решить эту проблему; Вы можете изменить тип элемента на тип значения (a Struct
), вы можете перегрузить оператор ==
, вы можете использовать пользовательское сравнение на равенство и список можно продолжить.
Что бы я лично сделал, так это создал бы пользовательскую функцию сравнения на равенство, которая по существу говорит: «Элемент 1 равен элементу 2, если эти свойства одинаковы».
Небольшой пример:
public static bool IsEqualTo(this Item thisItem, Item otherItem)
{
if (thisItem is null) return otherItem is null;
else if (otherItem is null) return thisItem is null;
return thisItem.property1 == otherItem.property1
&& thisItem.property2 == otherItem.property2
&& thisItem.property3 == otherItem.property3;
}
Тогда просто поменяйте
if (Icont.islots[i].item == reci.Materials[0].item)
до
if (Icont.islots[i].item.IsEqualTo(reci.Materials[0].item))
Этот подход дает вам контроль над тем, как определить равенство. Например, вы можете сказать, что у каждого элемента в вашей игре есть свойство Id
, уникальное для этого типа элемента. Если это так, то ваш метод IsEqualTo()
просто должен возвращать, имеют ли оба объекта одинаковый идентификатор.
РЕДАКТИРОВАТЬ: Как сказал @ScottHannen в комментариях, если вы получаете NullReferenceException
, то это означает, что один из элементов, на который вы ссылаетесь, на самом деле не был инициализирован. Убедитесь, что каждый необходимый вам объект и свойство на обоих элементах действительно инициализированы.