2016-10-12 29 views
0

我有一個IEnumerable,我運行一個foreach。它拋出一個空引用異常在某些情況下就在foreach線,它說IEnumerable不是,但在迭代(C#)返回空引用異常

IEnumerable的投擲類型的異常「System.NullReferenceException

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

我把一個空檢查之前的foreach循環,並且iEnumerable傳遞null檢查,但是當我運行foreach循環時,它會拋出null引用異常。

+3

你還沒有給我們提供足夠的信息。你的'永恆'如何填充? – Amy

+2

請說明如何獲得此IEnumerable。如果你使用linq就像標籤所顯示的那樣,它可能是那裏的某處你得到空引用,但是被執行的不同,你只有在實際執行時纔會看到它 –

+0

'IEnumerable's在迭代它們時被評估。 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