CS801~2000

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

C# のコンパイラエラー CS1593 は、デリゲート呼び出し時に渡す引数の数が宣言されたパラメーター数と一致しない場合に発生します。

たとえば、デリゲートが引数 int を1つしか受け取らないのに対し、呼び出し時に hello(8, 9) と複数の値を渡すとエラーとなります。

エラーメッセージの詳細解析

エラー文の構造と意味

C# のコンパイラエラー CS1593 は、デリゲートの呼び出し時に指定された引数の数が、デリゲート宣言のパラメーター数と一致しない場合に発生します。

このエラーメッセージでは、例えば「デリゲート ‘del’ に ‘number’ 個の引数を指定することはできません」と記述され、正しくない引数数が提供されていることを示しています。

エラー内容を理解することで、どこで引数のミスマッチが発生しているかを把握でき、速やかに修正する手がかりとなります。

エラーメッセージ例の確認

エラーメッセージの典型的な例として、次のようなコードが挙げられます。

下記コードは誤った引数数を渡しているため、CS1593 エラーが発生します。

using System;
delegate string FuncDelegate(int i); // デリゲート宣言
class Program
{
    public static void Main(string[] args)
    {
        FuncDelegate func = new FuncDelegate(MethodExample);
        CallDelegate(func);
    }
    // シグネチャが int 型の引数1つで定義されている
    public static string MethodExample(int number)
    {
        Console.WriteLine($"引数は {number} です");
        return number.ToString();
    }
    public static void CallDelegate(FuncDelegate delegateInstance)
    {
        // 以下の呼び出しは、引数が2つ指定されているためエラーとなる
        delegateInstance(5, 10);
    }
}

下記は、上記コードをコンパイルした際に出力されるエラーメッセージの一例です。

CS1593: デリゲート 'FuncDelegate' に '2' 個の引数を指定することはできません

デリゲート宣言との不一致比較

エラーメッセージは、引数の数がデリゲートで定義されたシグネチャと合致していないことを示しています。

たとえば、前述の FuncDelegate は引数が1つの int型で定義されています。

一方、呼び出し側で2つの引数 (510) を指定しているため、エラーが発生します。

このように、関数の呼び出しにおける引数の数を、デリゲートの宣言時に設定されたパラメーター数と正確に一致させる必要があります。

デリゲート仕様と実装例の検証

デリゲートの基本原則

デリゲートは、特定のシグネチャ(戻り値の型と引数の型)を持つメソッドへの参照を安全に管理できる機能です。

メソッドの参照先を動的に変更可能なため、イベント処理やコールバック処理に適した仕組みとなっています。

宣言とシグネチャのポイント

デリゲートの宣言では、戻り値の型と各引数の型を明確に定義します。

たとえば、次の宣言は int型の引数を1つ受け取り string型の値を返すデリゲートを作成します。

delegate string FuncDelegate(int i);

この宣言に基づくメソッドは、必ず引数が1つである必要があり、メソッド呼び出し時も同様のシグネチャに従わなければなりません。

引数指定の留意点

デリゲートを呼び出す際は、渡す引数が宣言に沿った数と型でなければなりません。

引数の型が合っていても、数が異なる場合はコンパイル時にエラーが発生するため、引数の数が正確であることを確認してください。

発生例のコード検証

誤った呼び出し例の分析

次に示すコードは、デリゲート定義と呼び出しにズレがある例です。

ここでは、デリゲートが int型引数1つを期待しているのに対し、呼び出し側で2つの引数を指定しています。

using System;
delegate string FuncDelegate(int i); // デリゲート宣言
class Program
{
    public static void Main(string[] args)
    {
        // デリゲートにメソッドを紐付け
        FuncDelegate func = new FuncDelegate(MethodExample);
        // 誤った引数の呼び出しでエラー発生
        CallDelegate(func);
    }
    // デリゲートと同じシグネチャを持つメソッド
    public static string MethodExample(int number)
    {
        Console.WriteLine("受け取った数値は " + number + " です");
        return number.ToString();
    }
    public static void CallDelegate(FuncDelegate delegateInstance)
    {
        // 引数1つではなく、2つ渡しているためCS1593エラーとなる
        delegateInstance(5, 10);
    }
}

このコードでは、FuncDelegate が1つの int型引数を期待しているにもかかわらず、delegateInstance(5, 10) と呼び出しているため、コンパイラエラー CS1593 が発生します。

正しい呼び出し方法との比較

正しい呼び出し方法は、デリゲートのシグネチャに沿って引数の数を合わせることです。

修正例として、下記のように呼び出し側で正しい引数数を指定する必要があります。

using System;
delegate string FuncDelegate(int i); // デリゲート宣言
class Program
{
    public static void Main(string[] args)
    {
        // デリゲートにメソッドを紐付け
        FuncDelegate func = new FuncDelegate(MethodExample);
        // 正しい引数の呼び出し
        CallDelegate(func);
    }
    // デリゲートと同じシグネチャを持つメソッド
    public static string MethodExample(int number)
    {
        Console.WriteLine($"受け取った数値は {number} です");
        return number.ToString();
    }
    public static void CallDelegate(FuncDelegate delegateInstance)
    {
        // デリゲートのシグネチャに合わせて、引数を1つだけ渡す
        delegateInstance(5);
    }
}

以下は、このコードを実行した際の出力結果です。

受け取った数値は 5 です

このように、引数の数を正しく指定することで、コンパイルエラーが解消されることが確認できます。

CS1593 エラーの対処法と修正手順

エラー原因の検証ポイント

CS1593 エラーが発生した場合、まず対象のデリゲート宣言と実際の呼び出し部分のシグネチャを確認することが重要です。

エラー原因の検証は、以下のポイントに注意して進めてください。

ソースコードのチェック方法

・デリゲートが正しく宣言されているかを確認します。

・メソッドのシグネチャ(戻り値と引数の型および数量)が、宣言されたデリゲートと一致しているか確認します。

・呼び出し部分で指定された引数の数が、デリゲートの宣言に沿っているかチェックします。

コンパイラログの読み解き方

コンパイラログには、エラーがどの行で発生しているか明確に示されています。

例えば、「CS1593: デリゲート ‘FuncDelegate’ に ‘2’ 個の引数を指定することはできません」とある場合、エラー行と渡された引数数が非常に重要な情報となります。

ログをもとに、引数指定の誤りを正しく把握してください。

修正手順の具体的対応策

エラー発生時の修正手順は、デリゲート宣言と呼び出し部分のシグネチャを一致させることです。

以下の手法で修正を進めると問題が解決します。

引数の正確な調整方法

  1. デリゲート宣言を再確認して、必要な引数の数と型を確認する。
  2. 呼び出し側のコードにおいて、渡す引数の数と型をデリゲートのシグネチャに一致するように修正する。
  3. 必要な場合、デリゲート宣言を目的に合わせて新たに定義し直す。

以下の修正済みサンプルコードは、引数を正しく指定する方法を示しています。

using System;
delegate string FuncDelegate(int i); // 正しい宣言
class Program
{
    public static void Main(string[] args)
    {
        // デリゲートに正しいメソッドを紐付ける
        FuncDelegate func = new FuncDelegate(MethodExample);
        // シグネチャに従った呼び出し
        CallDelegate(func);
    }
    public static string MethodExample(int number)
    {
        Console.WriteLine("受け取った数値は " + number + " です");
        return number.ToString();
    }
    public static void CallDelegate(FuncDelegate delegateInstance)
    {
        // 1つの引数を指定することでエラーを回避する
        delegateInstance(5);
    }
}

修正後の動作確認のポイント

修正後は、以下の点を確認して動作が正しいか評価してください。

・コンパイルエラーが解消され、正常にコンパイルできるか。

・実際の呼び出し結果が予想通りになっているか。

・ログやデバッグ出力を参考に、デリゲート呼び出し部分が正しく機能しているかを確認する。

上記の検証と修正手順により、CS1593 エラーの原因を正確に把握し、効果的な対応が可能となります。

まとめ

本記事では、C#のコンパイラエラーCS1593の原因と対処法について解説しています。

デリゲートの宣言と呼び出しにおける引数の数にズレがある場合に発生するエラーであることを確認し、誤った呼び出し例と正しい実装例を比較しました。

さらに、ソースコードやコンパイラログを活用したエラー原因の特定方法や、引数調整の具体的な手順を理解することができます。

関連記事

Back to top button