1. ホーム
  2. c#

[解決済み】.NETのforeachループでコレクションがNULLの場合、NullRefExceptionが投げられるのはなぜですか?

2022-04-05 07:34:39

質問

そこで、よくこんな場面に出くわすのですが...。 Do.Something(...) は、次のようにヌルコレクションを返します。

int[] returnArray = Do.Something(...);

そして、このコレクションをこんな風に使ってみる。

foreach (int i in returnArray)
{
    // do some more stuff
}

なぜforeachループはNULLコレクションを操作できないのでしょうか? 論理的には、NULLコレクションでは0回の反復処理が実行されるはずなのですが...その代わりに NullReferenceException . どなたか、この理由をご存じですか?

これは、何を返すのかが明確でないAPIを扱っている私にとっては悩ましいことで、結局は if (someCollection != null) のようなものです。

編集する 皆さん、説明ありがとうございました foreach が使用します。 GetEnumerator で、取得する列挙子がない場合、foreachは失敗します。 私は、言語/ランタイムが列挙子を取得する前にNULLチェックを行うことができない、または行わない理由を尋ねているのだと思います。 このような動作は、まだ十分に定義されていると思われます。

解決方法は?

しかし、現実的には、コレクション・オブジェクトはNULLなので、コンパイラが列挙器を使ってコレクションをループさせることはできません。

どうしてもこのようなことが必要な場合は、NULL合体演算子を試してみてください。

int[] array = null;

foreach (int i in array ?? Enumerable.Empty<int>())
{
   System.Console.WriteLine(string.Format("{0}", i));
}