C# コンパイラエラー CS1958 の原因と対処法について解説
CS1958はC#で発生するコンパイルエラーです。
デリゲート作成時にオブジェクト初期化子を使用し、中かっこを付けてしまうとこのエラーが出ます。
デリゲートには初期化対象のメンバーがないため、記述から中かっこを除くことでエラーは解消します。
たとえば、new D<int>(GenericMethod<int>) { }
という記述をnew D<int>(GenericMethod<int>)
に変更する必要があります。
エラー発生の詳細解説
CS1958エラーの概要
CS1958エラーは、デリゲート作成式に対してオブジェクト初期化子を適用しようとした場合に発生します。
C#では、デリゲートはクラスや構造体のようなメンバーを持たないため、初期化子でプロパティやフィールドを初期化する概念が存在しません。
そのため、デリゲート作成時に中かっこ { }
を付加すると、オブジェクト初期化子として解釈されエラーが発生することになります。
エラー発生状況の背景
デリゲートとオブジェクト初期化子の役割の違い
デリゲートはメソッドの参照を保持するための型であり、特定の機能実行のためにメソッドを呼び出す仕組みです。
一方、オブジェクト初期化子はクラスや構造体のインスタンス生成後に各フィールドやプロパティに初期値を設定するための構文です。
このため、デリゲート作成式にオブジェクト初期化子の構文を適用することは意味を成さず、正しい構文ではありません。
不要な中かっこによる記述ミス
デリゲート作成時に中かっこ { }
を記述してしまうと、コンパイラはそれをオブジェクト初期化子とみなしエラーを発生させます。
通常、デリゲート作成式は単一の引数としてメソッド参照を渡せば十分であり、中かっこは不要です。
単なる入力ミスやコピーペーストによる余計な記述が原因のことがほとんどです。
原因の詳細解析
デリゲート作成時の誤記述
オブジェクト初期化子の不適切な適用
誤ったコードでは、デリゲート作成式に中かっこ { }
を追加してしまうため、コンパイラはこれをオブジェクト初期化子として処理しようとします。
デリゲートは初期化子の対象となるプロパティやフィールドを持たないため、エラーが発生します。
例えば、以下のコードはエラーを引き起こす誤った記述例です。
using System;
public class DelegateTest
{
delegate void PrintDelegate(string message);
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
public static void Main(string[] args)
{
// 誤った記述例: デリゲート作成時に不要な中かっこを付けてしまっている
PrintDelegate printer = new PrintDelegate(PrintMessage) { };
printer("エラーが発生するコード例です");
}
}
// 上記コードはコンパイルエラー: オブジェクト初期化子はデリゲート作成式には適用できません。
中かっこが付加される理由
開発中に中括弧 { }
を用いてオブジェクト初期化を行う機会が多いため、誤ってデリゲート作成式にも同様に記述してしまうケースが発生します。
構造体やクラスの初期化と混同しやすく、慣れている書き方がそのまま持ち込まれてしまうのが原因です。
コンパイラの動作と解釈のポイント
コンパイラは、コードを解釈する際に記述された中かっこ { }
をオブジェクト初期化子として認識します。
デリゲートの場合、オブジェクト初期化子の適用先が存在しないため、構文上の不整合が生じエラーを報告します。
このエラーは、構文解析と型解決の段階で特に顕著に現れ、適切な修正が必要となるポイントです。
対処法および修正手順
コード記述の正しい記述例
誤ったコード例と修正後のコード比較
以下は、誤ったコード例と修正後の正しいコード例の比較です。
・誤ったコード例:
using System;
public class DelegateTest
{
delegate void PrintDelegate(string message);
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
public static void Main(string[] args)
{
// 中かっこが不要なためエラーが出る記述
PrintDelegate printer = new PrintDelegate(PrintMessage) { };
printer("エラー発生の例です");
}
}
// コンパイルエラー: オブジェクト初期化子はデリゲート作成式には適用できません。
・修正後のコード例:
using System;
public class DelegateTest
{
delegate void PrintDelegate(string message);
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
public static void Main(string[] args)
{
// 中かっこを削除し、正しい構文でデリゲート作成
PrintDelegate printer = new PrintDelegate(PrintMessage);
printer("正しいコード例です");
}
}
正しいコード例です
中かっこ削除の具体的手順
修正は単純で、デリゲート作成式に付加された中かっこ { }
を削除するだけです。
具体的には、以下の手順に従って修正します。
• 該当するコード行を特定する
• デリゲート作成式の後ろにある中かっこ { }
を削除する
• コード全体を再確認し、再コンパイルしてエラーが解消されていることを確認する
修正時の確認ポイント
コード検証と動作確認の留意点
修正後は、以下の点に注意してコードの動作確認を行ってください。
• コンパイルエラーが解消されているかを確認する
• デリゲートが正しくメソッドを参照しているか、意図したメッセージが出力されるかをチェックする
• 他に同様の誤記述がないか、コード全体を確認する
以上の手順を踏むことで、CS1958エラーをスムーズに解消することができます。
まとめ
この記事では、CS1958エラーの概要と発生原因、具体的な誤記述例および修正手順を解説しました。
デリゲート作成時に不要な中かっこを記述してしまうとエラーが発生する理由や、正しいコード記述方法、コード検証のポイントを明確に説明しています。
これにより、エラー解消のための具体的な対応策が理解できます。