2016-10-12 4 views
0

私はforeachを実行するIEnumerableを持っています。それは、foreachのライン上の特定の場合にはnull参照例外を投げ、それがIEnumerableではなく、反復でnull参照例外を返します。(C#)

IEnumerableを私はforeachの前にヌルチェックを入れSystem.NullReferenceException

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

のタイプの例外を投げたと言いますループし、iEnumerableはnullチェックを渡しますが、foreachループを実行するとnull参照例外がスローされます。

+3

純粋に楽しみのために、ここでは同じように失敗することを別のです。あなたの 'ienumerable'はどのように埋められていますか? – Amy

+2

このIEnumerableの入手方法を示してください。もしあなたがlinqをタグのように使用したとすれば、どこかでnull参照を得ることができるかもしれませんが、実際に実行したときにのみ表示されるという違いがあります。 –

+0

'IEnumerable'が反復処理されるときに評価されます。その項目を取得する 'IEnumerable'はどこですか? – Brandon

答えて

0

あなたのIEnumerableを内の項目が時々nullで、

はこの試してみてください。ここに

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

イテレータは、例外をスローするなど、反復処理時に何かを行うことができます。基本的には、ソースが何であるかを知る必要があります。たとえば、これは同じように投げるnull以外のイテレータです:

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

これはループを介して第2の時刻まで失敗しません。そこで、イテレータがどこから来たのか、イテレータがどのように実装されているのかを見てください。あなたは私たちに十分な情報を提供していない

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

標準的なヌル参照の質問の主な答えに編集されていれば涼しいでしょう。 – hatchet