C#のエラーを直して覚える
実際に出力されるメッセージを読みながら、空欄を埋めて直します。全102問。間違えた問題は翌日・3日後・7日後に自動で再出題されます。
エラー別に調べる
初級
- ; expected の原因と直し方C#で最も頻繁に出るコンパイルエラーです。セミコロンの付け忘れをコンパイラがどう検出するかを理解すると、報告される列番号のずれにも対応できます。
- } expected の原因と直し方波括弧の対応が崩れたときに出ます。エラー行がファイル末尾やブロック末尾を指すため、原因箇所の特定にコツが要ります。
- Cannot implicitly convert type の原因と直し方暗黙的に変換できない型同士を代入しようとしたときに出ます。string→intやbool→intなど、C#が許さない組み合わせを押さえておきましょう。
- does not exist in the current context の原因と直し方変数名のスペルミスやスコープ外参照で出る、初心者に最も身近なエラーの一つです。
- type or namespace name could not be found の原因と直し方List<T>やDictionary、StringBuilderなど、名前空間ごとに分かれたクラスを使うにはusingディレクティブが必要です。
- No overload for method の原因と直し方メソッドの引数の数や型が定義と一致しないときに出ます。オーバーロード解決の仕組みを理解する入り口になります。
- not all code paths return a value の原因と直し方値を返すと宣言したメソッドで、すべての実行経路にreturn文があるかをコンパイラが検証します。
- Use of unassigned local variable の原因と直し方ローカル変数は宣言しただけでは値を持ちません。条件分岐をまたいだ使用で見落としがちなエラーです。
- static文脈からインスタンスメンバーへアクセスした原因staticなMainからインスタンスメンバーへ直接アクセスしようとしたときに出ます。static/インスタンスの違いを理解する重要なつまずきポイントです。
- switch文のフォールスルー禁止エラーの原因と直し方C#のswitch文はCやJavaと違い、暗黙のフォールスルーを認めません。各caseの終わり方に明示的な文が必要です。
- Index was outside the bounds of the array の原因と直し方配列やリストの範囲外アクセスで実行時に発生します。ループの境界条件の誤りが典型的な原因です。
- Object reference not set エラー(null参照)の原因C#で最も有名な実行時エラーです。nullのままの変数のメンバーにアクセスしようとすると発生します。
- The input string was not in a correct format の原因と直し方int.Parseなどの変換メソッドに、数値として解釈できない文字列を渡したときに発生します。
- Attempted to divide by zero の原因と直し方整数の除算・剰余演算で除数が0のときに発生します。浮動小数点数の0除算とは挙動が異なる点に注意が必要です。
中級
- Collection was modified の原因と直し方foreach中にList等のコレクションの要素数を変えると発生します。反復子(イテレータ)が内部状態の不整合を検知する仕組みです。
- struct(値型)とclass(参照型)のコピーの違いstructは値型、classは参照型です。代入や引数渡しのたびに値そのものがコピーされるか、参照が共有されるかが変わります。
- == が参照を比較してしまう理由classの==は既定でオブジェクトの参照(同一性)を比較します。フィールドの値が同じでも、別々に生成したインスタンスはfalseになります。
- Unable to cast object の原因と直し方object型に格納された値型(ボックス化)を、元の型と異なる型でアンボックスしようとすると発生します。
- The given key was not present in the dictionary の原因と直し方Dictionaryに登録されていないキーをインデクサで読み取ろうとすると発生します。
- ArgumentOutOfRangeException の原因と直し方List<T>のインデクサに範囲外の値を渡すと発生します。配列のIndexOutOfRangeExceptionとは異なる例外クラスです。
- Sequence contains no elements の原因と直し方LINQのFirst()を、要素が1つもないシーケンスに対して呼び出すと発生します。
- does not implement interface member の原因と直し方インターフェースを実装すると宣言したクラスが、そのメンバーの一部を実装していないときに出るコンパイルエラーです。
- is inaccessible due to its protection level の原因と直し方privateなメンバーにクラスの外部からアクセスしようとすると出るコンパイルエラーです。
- 整数のオーバーフローが例外にならない理由int型の範囲(約-21億〜21億)を超える計算をしても、既定では例外にならず値が折り返ります。
- cannot be used as type parameter の原因と直し方where T : IComparable<T>のような制約を満たさない型を、ジェネリックメソッドの型引数として渡そうとすると出るコンパイルエラーです。
- 文字列を変更したはずが変わらない理由string型は不変(イミュータブル)です。ToUpperやReplace、Trimなどのメソッドは新しい文字列を返すだけで、元の変数は書き換えません。
上級
- A readonly field cannot be assigned to の原因と直し方readonly修飾子を付けたフィールドを、コンストラクタや初期化子以外の場所で書き換えようとすると出るコンパイルエラーです。
- TypeInitializationException の原因と直し方静的コンストラクタ(staticフィールドの初期化を含む)の中で例外が起きると、直接の例外ではなくTypeInitializationExceptionに包まれて報告されます。
- SwitchExpressionException の原因と直し方switch式が全てのパターンを網羅していないとき、コンパイラは警告を出しますが止めません。網羅されていない値が実際に渡された瞬間に実行時エラーになります。
- sealedメンバーをオーバーライドしようとした原因と直し方sealed overrideを付けたメンバーを、さらに下の派生クラスでオーバーライドしようとすると出るコンパイルエラーです。
- record と class で == の結果が変わる理由recordはプロパティの値が全て同じなら==がtrueになる値ベースの等価性を自動生成します。classは既定で参照ベースの等価性のままです。
- ArrayTypeMismatchException の原因と直し方配列の共変性(string[]をobject[]として扱えること)を利用したコードで、実体の型と異なる要素を代入すると発生します。
- does not contain a definition の原因と直し方(明示的インターフェース実装)明示的インターフェース実装(void IWorker.Work()のような書き方)で定義したメンバーは、クラス型の変数からは見えません。インターフェース型の変数からしか呼び出せません。
- does not implement inherited abstract member の原因と直し方abstractなメンバーを持つ基底クラスを継承したのに、そのメンバーをoverrideしていないと出るコンパイルエラーです。