C#コンパイラエラーCS1065の原因と対策について解説
C# のコンパイラエラー CS1065は、匿名メソッド内で省略可能な引数に既定値を指定した場合に発生します。
例えば、delegate(int x = 42)
のような記述が原因となるため、エラー解消には既定値を削除し、delegate(int x)
のように宣言する必要があります。
エラー発生状況の確認
エラーメッセージの内容
エラーメッセージには「このコンテキストでは、既定値は無効です」という文言が表示され、エラーコードは CS1065
となります。
このメッセージは、匿名メソッドで省略可能な引数として既定値を設定しようとした際に出力されるもので、C# コンパイラが既定値の使用を許可していないことを示しています。
エラー発生箇所の特定
エラーは匿名メソッドを定義する部分で発生します。
例えば、匿名メソッド内において引数に既定値を指定した場合、以下のようなコードでエラーが発生します。
使用しているファイル名や行番号がエラーメッセージに表示されるため、その情報を基に対象のコード箇所を特定することが可能です。
エラーの原因
匿名メソッドにおける省略可能な引数の扱い
C# では、既定値(省略可能な引数)はメソッド宣言に対してのみ使用される仕様となっています。
匿名メソッドは delegate
演算子を使用して定義されるため、ここで引数に既定値を設定すると、引数の省略と既定値の計算などの解釈に混乱が生じ、コンパイラがエラーを発生させます。
デリゲート演算子の仕様と制限
匿名メソッドはデリゲート演算子を使用して宣言されます。
このとき、既定値の指定はサポートされず、デリゲートの署名に厳密に従う必要があります。
そのため、匿名メソッド内での引数に既定値を記述することは許されず、コンパイラはこれを誤用として認識します。
既定値指定の誤用例の検証
誤用例として、以下のコードでは匿名メソッドの引数に既定値 42
を設定しようとしており、コンパイル時に CS1065
エラーが発生します。
このように、匿名メソッドに既定値を設定する記述は言語仕様に合致していないため、エラーとなります。
エラー対策と修正方法
既定値指定削除による修正手法
匿名メソッドでエラーが発生する原因は、引数に既定値を指定していることにあります。
正しい対策は、既定値指定を削除し、引数を必須とする形にすることです。
コード修正前の例
以下の例は、コンパイラエラー CS1065
が発生する誤ったコードです。
using System;
// 誤ったコード: 匿名メソッド内で既定値42を指定している
class Program
{
delegate void PrintDelegate(int number);
static void Main()
{
// 匿名メソッドで引数に既定値が指定されている
PrintDelegate printAction = delegate(int number = 42)
{
// コメント: 数字を表示する
Console.WriteLine("数字は: " + number);
};
// 呼び出し例
printAction(10);
}
}
コンパイル時に「このコンテキストでは、既定値は無効です。 (CS1065)」というエラーが発生
コード修正後の例
修正後は、既定値指定を削除し、引数を必須の形に変更します。
また、任意の値を渡すか、必要な場合は別途メソッドオーバーロードなどで対応します。
using System;
// 修正後のコード: 匿名メソッド内から既定値を削除
class Program
{
delegate void PrintDelegate(int number);
static void Main()
{
// 匿名メソッドで引数に既定値を指定せずに定義する
PrintDelegate printAction = delegate(int number)
{
// コメント: 数字を表示する
Console.WriteLine("数字は: " + number);
};
// 呼び出し例
printAction(10);
}
}
数字は: 10
修正後のコード検証方法
修正後のコードは、C# の通常のコンパイル手順に従ってビルドし、実行することで正しく動作するか検証します。
コマンドラインや統合開発環境(IDE)を用いて以下の手順で動作確認を行います。
- ソースコードを保存する
- コンパイルを実施する
例: csc Program.cs
- コンパイル後、実行ファイルを実行する
例: Program.exe
または IDE のデバッグ実行
以上の手順で、エラーが解消され正しい出力がされていることを確認できます。
まとめ
本記事では、C# におけるコンパイラエラー CS1065 の原因と対応方法を解説しました。
匿名メソッドでは既定値指定が許容されない理由や、デリゲート演算子の制限について説明し、既定値指定を削除することで発生するエラーを解決する方法を具体例を交えて示しました。
これにより、修正後のコードが正しく動作する手順が理解できます。