references
— это массив произвольного типа ChaptersReferenceBase[]
Я хотел бы перевернуть массив, прежде чем получать первую ссылку на основе некоторого состояния.
public ChaptersReferenceBase GetAvailableReference() // This works but doesn't reverse the array
{
foreach (var item in references)
{
if (item.State == StorageSlot.Available) return item;
}
return null;
}
public ChaptersReferenceBase GetAvailableReference() // This works but doesn't reverse the array
{
return references.First(reference => reference.State == StorageSlot.Available);
}
public ChaptersReferenceBase GetAvailableReference() // Throws nullReferenceException
{
Array.Reverse(references);
return references.First(reference => reference.State == StorageSlot.Available);
}
public ChaptersReferenceBase GetAvailableReference() // Throws nullReferenceException
{
return references.Reverse().First(reference => reference.State == StorageSlot.Available);
}
Почему это происходит в моем модульном тесте Unity? Как я могу перевернуть массив и получить правильный элемент.
Вторые два подхода, которые, как вы утверждаете, ставят NullReferenceException
, на самом деле работают и не создают исключения: dotnetfiddle.net/jSpDbp
@canton7 canton7, может быть, это ошибка в программе запуска тестов Unity? Я был удивлен, что мой тест не удался из-за обратной операции.
@KonstantinMakarov references.LastOrDefault(reference => reference.State == StorageSlot.Available);
Выдает NullReference также в модульном тесте Unity (не в утверждении, а в коде).
@Андо, попробуй: references.LastOrDefault(reference => reference != null && reference.State == StorageSlot.Available);
или references.Where(reference => reference != null).LastOrDefault(reference => reference.State == StorageSlot.Available);
когда вы foreach с помощью first() , это означает, что ваш первый элемент не равен нулю, возможно, такие данные:
[obj,null,null,null]
и сначала найдите obj. так что не бросайте NullReferenceException
.
но и когда вы меняете массив следующим образом:
[null,null,null,obj]
теперь первый элемент имеет значение null, так что давайте NullReferenceException
сейчас.
это подло NullReferenceException
reference.State
А разве LINQ не обработает нули? Спасибо за ответ. Я думаю, что ваше предположение верно, но я не понимаю, почему это должно быть проблемой.
@Ando, проблема возникает при доступе к свойству отсутствующего элемента, то есть здесь: reference.State
(null.State
)
@Ando Нет, LINQ не обрабатывает значение null. вы можете проверить самостоятельно.
references.LastOrDefault(reference => reference.State == StorageSlot.Available);