C# コンパイラエラー CS0201の原因と対策について解説
CS0201は、C#で無効なステートメントとして認識されるコードがある場合に出るコンパイル エラーです。
たとえば、計算式「2 * 3;」のように、結果をどこにも利用していない式が原因で発生します。
エラーを解消するには、計算結果を変数に代入するなど、正しいステートメントを記述してください。
エラーの基本
CS0201エラーとは
CS0201エラーは、C#プログラム内で無効なステートメントが記述された場合に発生するコンパイルエラーです。
C#では、基本的に「割り当て」「呼び出し」「インクリメント」「デクリメント」「new」で始まる式のみがステートメントとして認識されます。
このエラーは、単独の式が値を返すだけでステートメントとして処理できない場合に表示されます。
たとえば、計算式 2 * 3
のみの行はステートメントとして認識されず、正しく動作しません。
ステートメントと式の違い
C#では、プログラムの実行を指示するために「ステートメント」と「式」を区別しています。
・ステートメントは処理の実行を指示するもので、たとえば変数への代入やメソッド呼び出しが該当します。
・式は値を生成するものですが、そのままでは処理として完結しません。
たとえば、単に計算を行う a + b
のような記述は結果を返すだけで、何らかの操作に利用されなければステートメントとして機能しません。
エラー発生の原因
無効なステートメントの定義
C#では、命令文として正しく認識されるためには、特定の条件を満たす必要があります。
次のような場合、無効なステートメントとされCS0201エラーが発生します。
・割り当て演算子=
、メソッド呼び出しの()
、インクリメント++
やデクリメント--
、あるいはnew
で始まらない行
・単独の計算式や値だけが記述されている場合
これらの記述は、結果を利用するような動作に結びついておらず、処理が完結していないと判断されます。
間違った記述例の解説
無効なステートメントと判断される具体例として、以下のような記述が挙げられます。
・計算式だけの行
// 無効な記述例
public class Sample
{
public static void Main()
{
2 * 3; // 結果を変数に代入しておらず、何も実行されない
}
}
・インクリメント演算子を単独で利用
public class Sample
{
public static void Main()
{
int count = 0;
count++; // 単体ではエラーにならないが、特定の場合に誤用される可能性がある
}
}
インクリメント操作の場合、演算子が正しいコンテキスト内で使用されないと、正しく処理されないことがあります。
発生する主なケース
数式を単独で記述した場合
単独で計算式を記述すると、その結果がどこにも格納されず、処理として意味を成しません。
たとえば、以下のコードはエラーとなります。
public class Calculation
{
public static void Main()
{
5 + 10; // 計算結果を変数に保存していないため、無効なステートメントと認識されます
}
}
このような場合、計算結果を変数に代入するなどの修正が必要です。
インクリメント・デクリメント操作の誤用
インクリメント++
やデクリメント--
操作は、変数の値を変更するために使用されますが、誤ったコンテキストで利用するとエラーとなります。
たとえば、checked
ブロックや関数のパラメータとして利用する場合、単体での操作はエラーとなることがあります。
public class CounterExample
{
public static void Main()
{
int counter = 0;
// checked 演算子の中で操作する場合はブロック内で記述する必要があります
checked(counter++); // この記述はCS0201エラーとなる可能性があります
}
}
その他の不正な記述パターン
その他にも、次のようなパターンでCS0201エラーが発生することがあります。
・不必要な括弧やセミコロンがある場合
・式の結果を利用しない場合
これらはコードレビューやデバッグを通じて発見され、必要に応じて修正する必要があります。
コード例で確認するエラー回避策
エラー発生コード例の検証
無効な記述の具体例
以下のサンプルは、無効なステートメントとしてエラーが発生する例です。
コメントと文字列リテラルは日本語、変数名は英語表記にしています。
// CS0201_ErrorExample.cs
public class ErrorExample
{
public static void Main()
{
// ここでは計算結果を変数に代入していないためエラーが発生します
2 * 3;
}
}
CS0201: Only assignment, call, increment, decrement, and new object expressions can be used as a statement
コンパイル時エラーメッセージの分析
エラーメッセージは通常、無効な行に対し「割り当て、呼び出し、インクリメント、デクリメント、新しいオブジェクトの式のみがステートメントとして使用できます」という内容を示します。
このメッセージは、式が有効なステートメントとして認識されるためには、結果がどこかに利用される、または副作用が発生する必要があることを示しています。
修正方法と正しい記述例
値を変数に代入するパターン
計算式などの値を変数に代入することで、式がステートメントとして正しく機能します。
以下に修正例を示します。
// CS0201_FixedExample.cs
public class FixedExample
{
public static void Main()
{
// 計算結果を変数resultに代入することで、ステートメントとして認識されます
int result = 2 * 3;
// 結果を確認するためにConsole.WriteLineを利用
System.Console.WriteLine("計算結果: " + result);
}
}
計算結果: 6
適正なメソッド呼び出しの利用
また、操作自体が目的の場合は、明確に意図した動作を行うメソッド呼び出しをする必要があります。
以下は、ステートメントとして正しい形の例です。
// CS0201_MethodCallExample.cs
public class MethodCallExample
{
public static void Main()
{
// 変数dataに対して値を設定し、その結果を確認するためにメソッドを呼び出します
int data = 5;
PrintData(data);
}
// Consoleにデータを出力するメソッド
public static void PrintData(int value)
{
System.Console.WriteLine("データ: " + value);
}
}
データ: 5
対策と注意点
ステートメントとして認識される構文ルール
C#の構文では、次の点に注意する必要があります。
・有効なステートメントは、値を返すだけでなく、その結果を変数に代入するか、メソッド呼び出しなどの副作用を持つ操作であること。
・単独の式の記述を避け、常にその意図する動作を明示する記述を心がけること。
・文法的に正当なブロックや制御構造内での配置を意識すること。
エラー防止の実践的ポイント
エラー防止のためには、以下の実践的ポイントを参考にしてください。
・コードを書いたら、コンパイルエラーメッセージを確認し、どの部分が誤っているかを素早く特定する。
・IDEの提供するシンタックスチェックや警告機能を活用して、入力時にエラーとなる可能性がある記述を早期に修正する。
・コードのリファクタリング時には、意図しない式がそのまま存在していないかを確認し、必要に応じてリファクタリングツールを活用する。
これらのポイントに注意することで、CS0201エラーを未然に防ぐことができ、より堅牢なコードを書くことができます。
まとめ
この記事では、C# コンパイラエラーCS0201の基本と、無効なステートメントの定義・発生原因を解説しています。
単独の計算式や誤ったインクリメント・デクリメント操作など、エラーを引き起こす記述パターンを具体例とともに紹介し、正しい修正方法として値の変数代入や適正なメソッド呼び出しを用いる対策を示しています。
これにより、エラーの原因や回避策が理解できます。