2013-11-25 6 views
0

Я получаю странное исключение NullReferenceException, которое я не могу понять, пытаясь макет коллекции для перечисления. Я не думаю, что это что-то вызвано Mock, но я не уверен на 100%. Может ли кто-нибудь определить что-то глупое, что я делаю?NullReferenceException при попытке перечислить с помощью Mock

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); 
foreach (OrderItemInfo orderItem in orders) 
{ 
    // Exception thrown on the first attempt to get an OrderItem in the foreach 
} 

Трассировка стека из этой строки кода заключается в следующем:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр
объекта. Результат StackTrace: в
CMS.SettingsProvider.ObjectDataSet 1.GetEnumerator() at
CMS.SettingsProvider.ObjectDataSet
1.GetObjectEnumerator() в
CMS.SettingsProvider.InfoDataSet`1.d__0.MoveNext()
на ...

Содержание сборника это просто оболочка вокруг IEnumerable. В моем случае это должно дать вам представление о том, что происходит. GetEnumerator (как неявные, так и неявные) реализации просто вызывает значения.

private IEnumerable<T> values; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="MockDataSet{T}"/> class. 
    /// </summary> 
    /// <param name="values">The values.</param> 
    public MockDataSet(IEnumerable<T> values) 
    { 
     if (values == null) 
      throw new ArgumentNullException("values"); 

     this.values = values; 
    } 

значение имеет единственное значение в нем, что я могу перечислить штраф через окно часов ...

enter image description here

Может кто-нибудь объяснить, что я делаю неправильно здесь?

+0

@lan почему вы не показываете какой-либо код внутри foreach. Это даст нам еще кое-что, о чем можно подумать. – Dinesh

+0

@Dinesh: Я могу - хотя я никогда не дошел до этого кода, и это зависит от домена. Я на самом деле только что нашел проблему ... отправлю ответ. – Ian

ответ

1

Это немного странное, что, по-моему, частично связано с CMS внизу (Kentico). Раньше я столкнулся с проблемой, на которой я поставил вопрос на Unable to call ToArray() on 3rd party class, и я просто понял, что это может иметь такой же аффект.

Похоже, что результат InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); затрудняет определение компилятором типа. Поэтому я думаю, что приведение встречающийся под сказать

((IEnumerable<OrderItemInfo>)orders)

Я считаю, что это не удается, в результате чего IEnumerable быть пустым, и, следовательно, к NullReferenceException. Резолюция представляет собой простой литой по каждому элементу:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); 
foreach (OrderItemInfo orderItem in orders.Cast<OrderItemInfo>()) 
{ 
    // Now works 
} 
0

orders - null. Вы думаете, что это не потому, что цикл начался, но помните, что это оценивается ленивым.

Измените код, как это, он не подведет:

InfoDataSet<OrderItemInfo> orders = OrderItemInfoProvider.GetOrderItems(orderInfo.OrderID); 
if (orders != null) 
{ 
    foreach (OrderItemInfo orderItem in orders) 
    { 
     // Exception thrown on the first attempt to get an OrderItem in the foreach 
    } 
} 

Помните также, всякий раз, когда вы смотрите на что-то в отладчике долгое время прошло во время циклов - если у вас есть какое-либо обновление асинхронного он, возможно, не закончил.

+0

Тогда почему отладчик ResultView показывает элемент в индексе [O] ??? – Dinesh

+0

Боюсь, что заказы не нулевые ... Как показано на часах, он заселен. Я попробовал проверку нулевой ссылки, и она терпит неудачу точно так же (обратите внимание, что я удалил часы перед запуском моего теста). – Ian

+0

@Ian - О, если вы разместили изображение, я не вижу его. (Брандмауэр). У вас есть код, как указано выше? Какова первая попытка использовать orderItem? – Hogan

Смежные вопросы