2016-08-23 7 views
-1

Мой кодSystem.IndexOutOfRangeException: Индекс находился вне границ массива C#

public bool Add(ConquerItem item) 
{ 
    if (objects.Length < item.Position) 
     return false; 

    if (objects[item.Position - 1] == null) 
    { 
     item.IsWorn = true; 
     UpdateItemview(item); 
     objects[item.Position - 1] = item; 
     item.Position = item.Position; 
     item.Send(Owner); 

     Owner.LoadItemStats(); 
     Owner.SendScreenSpawn(Owner.Entity, false); 

     return true; 
    } 
    else return false; 
} 

Ошибка говорит

System.IndexOutOfRangeException: Индекс находился вне границ этого массива

+0

Где эта ошибка? вы отлаживали код? –

+0

Я получаю эту ошибку в консоли, когда я пытаюсь добавить элемент в игру. –

+0

Если вы отлаживаете шаг шага, вы получите его в определенной строке, пожалуйста, попробуйте это. –

ответ

1

Вы можете попробовать следующий код

public bool Add(ConquerItem item) 
{ 
    if (objects.Length < item.Position || item.Position - 1 < 0 || objects[item.Position - 1] == null) 
     return false; 

    item.IsWorn = true; 
    UpdateItemview(item); 
    objects[item.Position - 1] = item; 
    item.Position = item.Position; 
    item.Send(Owner); 

    Owner.LoadItemStats(); 
    Owner.SendScreenSpawn(Owner.Entity, false); 
    return true; 
} 

Прежде всего, скорее всего, бывший когда вы пробовали objects[item.Position -1] == null, это связано с тем, что item.Position могло быть 0: p Это привело бы к тому, что значение стало -1, следовательно, вне диапазона.

4

Невозможно сказать, куда вы приносите objects и item, но эта ошибка возникает, когда вы получаете доступ к коллекции с индексом, который не существует.

Я думаю, что:

  1. item.Position является 0
  2. Коллекция пустой

Затем пройдет if заявление (потому что позиция не терке, чем длина) и вы получите:

   0 - 1  
objects[item.Position - 1] ==> objects[-1] 

, который бросит IndexOutOfRange

Изменить if заявление:

if (objects.Length < item.Position || item.Position - 1 < 0) 
    return false; 

Кроме того, в последней строке (else return false;) else является излишним, и вы можете просто написать return false;

+0

Если 'objects.Length

+0

Можете ли вы отредактировать мой код с добавлением? @Gilad Green –

+0

Вы имеете в виду, что я должен удалить 'else' в последнем ряду? –

1

Эта ошибка возникает, когда вы пытаетесь получить доступ или назначить индексатор в положении, в котором он не имеет никакого значения, например

string[] data = new string[2]; 
data[0] = "1"; 

string firstdata = data[-1];// 

и это, скорее всего, что происходит с вами. ваш item.Position является returnning 0 и вы вычитая его на 1, который -1 поэтому пытается сделать что-то вроде этого

objects[item.Position - 1] = item; 

, которая становится

objects[0 - 1] = item; 

, который становится

objects[-1] = item; 

который не существует и находится вне диапазона индекса, например, ваша ошибка

+0

Вот и все! –

+0

@ GiladGreen я прочитал, что это было неправильно ... XD – Neil

+0

@ GiladGreen не понимал, почему объект будет поддерживать значение индекса, и он столкнулся с моими мыслями – Neil