2015-05-29 3 views
0

У меня есть код .ToDictionary работает неожиданно и выбрасывает ошибку «Ссылка на объект не найдена»..ToDictionary throws exception "NullReferenceException"

var serviceOptions = serviceDurations.ToDictionary(so => so.OptionCode, StringComparer.OrdinalIgnoreCase); 

var serviceLines = serivceLinePayments.Select(sl => new ServiceLine(serviceOptions[sl.option_code], Decimal.ToInt32(sl.quantity), sl.customer_paid_amount)); 

если я заменяю этот код как.

var serviceOptions = serviceDurations.ToDictionary(so => so.OptionCode, StringComparer.OrdinalIgnoreCase); 

//var serviceLines = serivceLinePayments.Select(sl => new ServiceLine(serviceOptions[sl.option_code], Decimal.ToInt32(sl.quantity), sl.customer_paid_amount)); 

List<ServiceLine> serviceLines = new List<ServiceLine>(); 
foreach (var item in serivceLinePayments) 
{ 
var so = serviceOptions.FirstOrDefault(s => s.Value.OptionCode == item.option_code); 
ServiceLine line = new ServiceLine(so.Value, Decimal.ToInt32(item.quantity), item.customer_paid_amount); 
serviceLines.Add(line); 
} 

с помощью этого кода не исключение, но не в состоянии выяснить, что является реальной причиной этого исключения.

ответ

1

Я считаю, что ваш код строка serviceDurations.ToDictionary(... бросает пустую ссылку исключение, и это очевидная причина serviceDurations экземпляр null по какой-то причине и так, за исключение.

Вам нужно будет отладить и выяснить, почему serviceDurations экземпляр имеет значение null.

+0

Действительно? Тогда почему эта точная линия работает во втором фрагменте? –

+0

Действительно? Нереалистично? нет идеи, но может быть какая-то другая веская причина для NRE? Возможно, мне не хватает ... ты говоришь мне. – Rahul

+0

Я думаю, что компилятор обрабатывает код выражения лямбда по-разному, что мы видели (отлаживаем шаг за шагом). в первой строке .ToDictionary (...) пытается создать словарь, но выражение lamda 2-й строки входит в изображение и пытается извлечь значение из объекта словаря, который еще не создан. – Prashant

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