CS0~400

C# コンパイラエラー CS0123 の原因と対策について解説

CS0123はC#のコンパイラエラーで、デリゲートインスタンスを作成する際に、指定したメソッドのシグネチャがデリゲート宣言と一致しない場合に発生します。

対象メソッドの引数や戻り値が、定義されたデリゲートのシグネチャに合致しているか確認してください。

エラー原因の詳細

デリゲートとメソッドの役割

デリゲート宣言とシグネチャの基本

C#におけるデリゲートは、特定のシグネチャ(戻り値型と引数の型)を持つメソッドへの参照をカプセル化する型です。

デリゲートを宣言する際は、以下のように戻り値と引数の型を明示します。

このとき、デリゲートに紐づけるメソッドも同じシグネチャを持つ必要があります。

例えば、引数なしでvoidを返すデリゲートは次のように宣言します。

// デリゲート 'D' は引数がなく、戻り値が void
delegate void D();

この例では、D型のデリゲートに対応するメソッドは引数がなく、戻り値がvoidでなければなりません。

メソッドシグネチャの確認ポイント

デリゲートに割り当てるメソッドのシグネチャ確認では、以下の点に注意してください。

  • 引数の個数と型

引き渡す引数の個数がデリゲート宣言と一致しているか確認します。

  • 戻り値の型

メソッドが返す型がデリゲートの指定する戻り値の型と一致しているかをチェックします。

例えば、次のコードはデリゲートのシグネチャとメソッドのシグネチャが一致していないため、エラーが発生します。

using System;
// 引数なしのデリゲート
delegate void D();
// 引数ありのメソッド
public class Program {
    public static void SampleMethod(int value) {
        // "サンプルの処理"
        System.Console.WriteLine("引数ありのメソッドが実行されました。");
    }
    public static void Main() {
        // 以下の行はCS0123エラーとなる
        // delegate 'D' に一致する 'SampleMethod' のオーバーロードはありません
        // D d = new D(SampleMethod);
    }
}

この場合、メソッドSampleMethodは引数intを受け取りますが、デリゲートDは引数を持たないため不一致となります。

不一致が発生する状況

引数の不整合

引数に関して不一致が発生すると、渡すべき引数の数や型、順番に誤りが生じた状態となります。

以下のようなシナリオが考えられます。

  • デリゲートが引数を必要としないのに、引数付きのメソッドを指定してしまう
  • デリゲートが持つ引数の型とメソッド内で使用している型が異なる

このような状態ではC#コンパイラはシグネチャの一致を確認できないため、CS0123エラーが発生します。

戻り値の不一致

戻り値型が一致しない場合もエラーが発生します。

例えば、デリゲートがint型の値を返すと宣言しているのに、メソッドがvoidを返す場合、戻り値の不整合が原因となります。

シグネチャに含まれる戻り値型も、引数の型と同様に厳密に一致する必要があります。

エラー解決の対策

正しいシグネチャへの修正方法

シグネチャ確認の手順

  1. デリゲート宣言を確認し、指定された引数の数、型、及び戻り値の型を把握します。
  2. メソッド宣言部分を調べ、デリゲートが求める仕様と合致しているか確認します。
  3. 不一致が見つかった場合、引数や戻り値の型を修正し、デリゲートのシグネチャと一致させます。

例えば、先ほどの例ではSampleMethodをデリゲートDに合わせるため、引数を削除する必要があります。

修正例の提示

以下は、デリゲートDと一致するようにメソッドのシグネチャを修正したサンプルコードです。

using System;
// 引数なしのデリゲート
delegate void D();
public class Program {
    // デリゲートに合わせ、引数なしに変更
    public static void SampleMethod() {
        // "サンプルの処理"
        System.Console.WriteLine("引数なしのメソッドが実行されました。");
    }
    public static void Main() {
        // 正しくデリゲートにメソッドを割り当てる
        D d = new D(SampleMethod);
        d(); // メソッドの呼び出し
    }
}
引数なしのメソッドが実行されました。

このように、デリゲートの要求するシグネチャに合わせることで、CS0123エラーは解消されます。

修正後の検証手順

再コンパイルの確認

シグネチャの修正後は、まずソリューションを再コンパイルしてください。

エラーが解消され、プログラム全体が正しくビルドされるかを確認します。

再コンパイル後、IDE上にエラー表示がなくなることを目視確認します。

テスト実行時の注意事項

ビルドが成功した後は、実際にプログラムを実行して期待通りの動作をしているかを確認します。

特に以下の点に注意してください。

  • 修正したメソッドがデリゲート経由で正しく呼び出されること
  • 予期しない動作が出現していないか

出力結果が期待と異なる場合は、再度シグネチャの確認を行ってください。

修正適用事例

ケーススタディの解析

実際のプロジェクトで発生したCS0123エラーのケーススタディを通して、エラー原因と解決手順を確認します。

エラー発生時は、開発者が意図しないメソッドをデリゲートに紐づけようとした場合が多いです。

このようなケースでは、デリゲートとメソッド間のシグネチャの不一致を見直し、修正することで解決されました。

修正前と修正後の比較

以下の表は、修正前と修正後のコードの違いを示しています。

項目修正前修正後
引数の定義メソッドにint型の引数が存在メソッドは引数を持たず定義
デリゲート宣言delegate void D();delegate void D();(変更なし)
エラー状態CS0123エラー発生エラーなし

発生しやすいシグネチャミスマッチの例

以下の点にご注意ください。

  • 引数の個数が異なる

→ 例:デリゲートが引数なしなのに、メソッドが1つ以上の引数を持つ

  • 引数の型が異なる

→ 例:デリゲートにstringが指定されているのに、メソッドがintを受け取る

  • 戻り値の型が異なる

→ 例:デリゲートがboolを返す指定なのに、メソッドがvoidである

これらの点を意識してコードを見直すことにより、エラーの発生を未然に防ぐことが可能です。

まとめ

この記事では、CS0123エラーの原因を解析し、デリゲート宣言とメソッドのシグネチャ不一致がエラー発生に大きく影響することを示しました。

引数や戻り値の型・数の不整合が主な原因であるため、シグネチャの正確な確認と修正方法を具体例と共に説明しました。

これにより、正しいデリゲート利用の手順が理解できます。

関連記事

Back to top button
目次へ