2016-10-12 1 views
0

У меня есть IEnumerable, на котором я запускаю foreach. Он бросает пустую ссылку исключение в некоторых случаях на Еогеасп линии, это говоритIEnumerable не является, но возвращает исключение ссылочной ссылки на итерацию (C#)

IEnumerable бросил исключение типа «System.NullReferenceException

if (ienumerable != null) 
{ 
    foreach (var item in ienumerable) 
    { 
     ...... 
    } 
} 

Я положил в нуле проверки перед Еогеаспом loop, а iEnumerable передает нулевую проверку, но затем, когда я запускаю цикл foreach, он выдает исключение нулевой ссылки.

+3

Вы не предоставили нам достаточно информации. Как ваш «ienumerable» населен? – Amy

+2

Просьба показать, как вы получаете этот IEnumerable. Если вы использовали linq, как теги, предположите, что где-то там вы получите нулевую ссылку, но если вы выполняете различие, вы увидите ее только при фактическом выполнении –

+0

'IEnumerable' оцениваются по мере их повторения. Откуда «IEnumerable» получает свои предметы? – Brandon

ответ

0

элементы в вашей IEnumerable иногда нуль,

попробовать это:

if (ienumerable != null) 
    { 
     foreach (var item in ienumerable) 
     { 
      if(item != null) 
      { 
       // do stuff 
      } 

     } 
    } 

вот пример, чтобы попытаться для вас, ребята.

 string[] testStr = new string[] { null, "", "test" }; 
     foreach (var item in testStr) 
     { 
      if (item != null) 
      { 
       Console.WriteLine(item); 
      } 
      else 
      { 
       Console.WriteLine("item was null"); 
      } 
     } 

     Console.ReadKey(); 
+0

Или 'item.item.item! = Null' –

+0

Это не приведет к поведению, описанному в ошибке' IEnumerable' при извлечении следующего элемента. – Servy

+0

обновлен с помощью редактирования, чтобы показать вам, что он работает. –

2

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

var customers = new [] { 
    new Customer { Name = "abc" }, 
    new Customer { }, 
    new Customer { Name = "def" } 
}; 
IEnumerable<int> lengths = customers.Select(x => x.Name.Length); 

это не удастся, пока во второй раз через петлю. Итак: посмотрите, откуда появился итератор, и как выполняется итератор.

чисто для удовольствия, вот еще, что не сможет одинаково:

IEnumerable<int> GetLengths() { 
    yield return 3; 
    throw new NullReferenceException(); 
} 
+0

Было бы здорово, если бы это было отредактировано в главный ответ в каноническом нулевом справочном вопросе. – hatchet

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