C#で switch-case を使って文字列の分岐処理を書いていたところ、
突然「string の定数値が必要です」というエラーに遭遇した――。
case に変数を指定しているだけなのに、なぜ怒られるのか?
そもそも “定数値” とは何を指しているのか?
Visual Studio で頻出するエラーですが、仕組みを理解していないと意外とハマります。
実はこのエラー、C# における switch文の仕様が原因 です。
この記事では、再現コードから原因の解説、そして具体的な解決策まで分かりやすくまとめました。
- どうして「定数じゃないとダメ」なのか
- const を使った正しい書き方
- 変数を使いたい場合の代替案
これらを理解すれば、今後同じエラーに悩まされることはありません。
ぜひ、あなたの開発に役立ててください。
エラーが発生するコード例
まずは、実際に「stringの定数値が必要です」エラーが出るサンプルを見てみましょう。
string input = Console.ReadLine();
string key = "A";
switch (input)
{
case key: // ← ここでコンパイルエラー
Console.WriteLine("Aです");
break;
default:
Console.WriteLine("その他");
break;
}Visual Studioでは次のようなエラーメッセージが表示されます。
CS0150: 定数値が必要です一見正しく書けているように見えるのに、case key: で止められてしまう――
ここが多くの人がつまずくポイントです。
なぜエラーになるのか?原因を理解する
ポイントは、switch-case 文における case ラベルのルール にあります。
C#では、case の右側に指定できるのは、次のどちらかです。
- コンパイル時に確定している値(コンパイル時定数)
- 定数式
つまり、C# のコンパイラが「この値は絶対に変わらない」と判断できる場合に限り、case に使えるという仕組みです。変数はNGということになります。
変数はなぜNGなのか?
string key = "A";この変数は実行時にメモリ上に確保されるため、
コンパイル時点では値が決まっていません。
結果として、string の定数値が必要です というエラーが出ます。
定数がOKな理由
const string KEY = "A";const で宣言された変数は、
コンパイル時に値が埋め込まれる(リテラル扱い) ため、case に使用可能です。
つまり、コンパイラにとっては次のコードと同等です。
case "A":正しい書き方
case に変数を指定したい場合、状況に応じて次の方法が取れます。
解決策1:constを使う
case で固定値を使うなら、const を付けるだけで解決します。
string input = Console.ReadLine();
const string KEY = "A";
switch (input)
{
case KEY:
Console.WriteLine("Aです");
break;
default:
Console.WriteLine("その他");
break;
}- 値が変わらないと確定している場合に有効
constはコンパイル時に埋め込まれるためcaseに使用可能
解決策2:if-elseに置き換える
値が変わる可能性があるなら、switch にこだわらない選択もアリ。
string input = Console.ReadLine();
string key = "A";
if (input == key)
{
Console.WriteLine("Aです");
}
else
{
Console.WriteLine("その他");
}まとめ
switch-case で「string の定数値が必要です」というエラーが出るのは、
case に指定できるのがコンパイル時定数だけという C# の仕様が原因です。
状況別の解決策は以下の通り。
- 値が固定 → const を使う
- 動的な比較 → if-else
つまり、「case に変数を使えない」のではなく、
用途に応じて適切な分岐方法を選ぶ必要があるということです。
この仕組みを理解しておけば、今後同じエラーで迷うことはありません。
ぜひ日々の開発に役立ててください!
コメント