Code Fix

中級

Sequence contains no elements の原因と直し方

LINQのFirst()を、要素が1つもないシーケンスに対して呼び出すと発生します。

エラーメッセージの読み方

Unhandled exception. System.InvalidOperationException: Sequence contains no elements
System
名前空間 — System なら標準の基本例外です
InvalidOperationException
例外クラス — 何が起きたか。ここを検索するのが最短です
Sequence contains no elements
詳細メッセージ — どの値が問題だったか
at Program.Main(String[] args) in Program.cs:line 4
発生箇所 — スタックトレースの先頭行

このエラーが出る典型パターン

パターン1

 1  class Program {
 2      static void Main(string[] args) {
 3          var nums = new System.Collections.Generic.List<int> {         };
                                                                     ^
 4          System.Console.WriteLine(System.Linq.Enumerable.First(nums));
 5      }
 6  }
Unhandled exception. System.InvalidOperationException: Sequence contains no elements at Program.Main(String[] args) in Program.cs:line 4

First()は要素が1つもないシーケンスに対して呼ぶと例外を投げます。空かどうか分からない場合はFirstOrDefaultを使います。

直し方: (空)1, 2, 3 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  class Program {
 2      static void Main(string[] args) {
 3          var names = new System.Collections.Generic.List<string> {          };
                                                                          ^
 4          System.Console.WriteLine(System.Linq.Enumerable.First(names));
 5      }
 6  }
Unhandled exception. System.InvalidOperationException: Sequence contains no elements at Program.Main(String[] args) in Program.cs:line 4

文字列のリストでも規則は同じです。空リストにFirst()は使えません。

直し方: (空)"a", "b" にします。

この問題を解いてみる →

パターン3

 1  class Program {
 2      static void Main(string[] args) {
 3          var nums = new System.Collections.Generic.List<double> {          };
                                                                         ^
 4          System.Console.WriteLine(System.Linq.Enumerable.First(nums));
 5      }
 6  }
Unhandled exception. System.InvalidOperationException: Sequence contains no elements at Program.Main(String[] args) in Program.cs:line 4

double型のリストでも同じ例外になります。型に関わらずSequenceが空であることが原因です。

直し方: (空)1.5, 2.5 にします。

この問題を解いてみる →

よくある誤解

「最初の要素を取る」だけの単純な操作に見えますが、空である可能性を考慮しないと実行時エラーになります。空も許すならFirstOrDefaultを使います。

まとめ

Sequence contains no elementsは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)