[解決済み】.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));
}
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] IEnumerableにForEach拡張メソッドがないのはなぜですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] .NETでは、'for'と'foreach'のどちらのループが速く実行されますか?
-
[解決済み】.NETで文字列が不変なら、なぜSubstringはO(n)時間かかるの?
-
[解決済み】nullと空のコレクションのどちらを返すのが良いですか?
-
[解決済み】なぜ.NETはデフォルトで銀行員の丸めを使用するのですか?
-
[解決済み】`foreach`ループの反復をスキップするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] 関数を終了するには?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない