Если бы я угадал, я бы сказал, что эта строка ...
var item = _list.Where(
o => o.OrderDetail.TrayCode == orderResponse.OrderDetail.TrayCode)
.FirstOrDefault();
... потому что он вызывает FirstOrDefault()
, может возвращать null
. Установите точку останова и посмотрите, что на самом деле происходит.
С этой целью, зачем вообще этот запрос? Поскольку вы передаете объект, который нужно удалить, почему бы просто не сделать это:
int index = _list.IndexOf(item);
if (index >= 0)
this._list.RemoveAt(index);
//then pass item to your eventargs since it was the object removed.
Еще лучше, поскольку List<T>
имеет свой собственный метод Remove(T object)
:
this._list.Remove(item);
//this may throw an exception or not if the item is not in that collection,
// which is behavior you should probably retain
Sidenotes
Существует также возможное состояние гонки в том, как вы поднимаете событие CollectionChanged
. Между проверкой null
и ее поднятием абонент может удалить своего делегата из события. Вот простой способ избежать этого:
// initialize it with an empty lamda so it is never null
public event NotifyCollectionChangedEventHandler CollectionChanged = (o,e) => {};
Теперь вы можете просто поднять его, и вам больше не нужно проверять, имеет ли оно значение null:
public void Add(OrderResponse orderResponse)
{
this._list.Add(orderResponse);
CollectionChanged(this,
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add,
orderResponse, this._list.Count - 1));
}
Это не делает его полностью поточно-ориентированным, но это простой способ убедиться, что повышение события не вызовет исключение нулевой ссылки.