C#の三項演算子とは?if文との違い・使い方・ネストの注意点を初心者向けに解説

はじめに

C#で条件分岐を書くとき、多くの初心者が最初に学ぶのはif文です。

たとえば、「点数が60点以上なら合格、それ以外なら不合格」といった処理は、if文を使えば次のように書けます。

C#
int score = 75;
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

Console.WriteLine(result);

このような「条件によって代入する値を切り替える」場面では、C#の三項演算子を使うと、より短く書けます。

C#
int score = 75;
string result = score >= 60 ? "合格" : "不合格";

Console.WriteLine(result);

三項演算子は便利な書き方ですが、使いすぎるとコードが読みにくくなることもあります。

この記事では、C#の三項演算子とは何か、基本構文、if文との違い、使いどころ、ネストの注意点まで、初心者向けにわかりやすく解説します。

1. C#の三項演算子とは?

1-1. 三項演算子は「条件によって返す値を切り替える」ための書き方

C#の三項演算子は、条件によって返す値を切り替えるための演算子です。

基本的には、次のような考え方で使います。

C#
条件 ? 条件がtrueの場合の値 : 条件がfalseの場合の値

たとえば、年齢が20歳以上なら「成人」、そうでなければ「未成年」という文字列を返したい場合、次のように書けます。

C#
int age = 18;

string message = age >= 20 ? "成人" : "未成年";

Console.WriteLine(message);

このコードでは、age >= 20が条件式です。

ageが20以上なら"成人"が返され、20未満なら"未成年"が返されます。

1-2. 正式には条件演算子とも呼ばれる

C#の三項演算子は、正式には条件演算子とも呼ばれます。

記号としては、?:を組み合わせた?:を使います。

C#
条件式 ? trueの場合の値 : falseの場合の値

「三項演算子」と呼ばれる理由は、次の3つの要素を使うからです。

C#
条件式
trueの場合の値
falseの場合の値

つまり、1つの演算子で3つの項目を扱うため、「三項」演算子と呼ばれます。

C#では、一般的に「三項演算子」と言えば、この条件演算子?:を指します。

1-3. if文より短く書ける場面がある

三項演算子の大きなメリットは、if文より短く書ける場面があることです。

たとえば、次のif文を見てみましょう。

C#
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

この処理は、三項演算子を使うと次のように書けます。

C#
string result = score >= 60 ? "合格" : "不合格";

代入する値を条件によって切り替えるだけなら、三項演算子のほうが簡潔です。

ただし、短く書けるからといって、すべて三項演算子にすればよいわけではありません。

読みやすさを損なう場合は、if文を使ったほうがよいです。

1-4. 初心者がつまずきやすいポイント

初心者がC#の三項演算子でつまずきやすいポイントは、主に次のようなものです。

C#
string result = score >= 60 ? "合格" : "不合格";

この1行の中に、条件、trueの場合、falseの場合がまとめて書かれているため、最初はどこで分岐しているのか分かりにくく感じるかもしれません。

特に、次のような点で混乱しやすいです。

  • ?:の役割が分からない

  • if文との違いが分からない

  • 複数条件を入れると読みにくくなる

  • trueの場合とfalseの場合の型が合わずにエラーになる

  • ネストすると処理の流れを追いにくくなる

三項演算子は、慣れると非常に便利です。

しかし、初心者のうちは「値を切り替えるための短いif文のようなもの」と考えると理解しやすいです。

2. C#の三項演算子の基本構文

2-1. 三項演算子の書き方

C#の三項演算子は、次の構文で書きます。

C#
条件式 ? trueの場合の値 : falseの場合の値

実際のコードでは、次のように変数への代入でよく使われます。

C#
string result = 条件式 ? trueの場合の値 : falseの場合の値;

たとえば、数値が偶数か奇数かを判定する場合は、次のように書けます。

C#
int number = 10;

string result = number % 2 == 0 ? "偶数" : "奇数";

Console.WriteLine(result);

number % 2 == 0がtrueであれば"偶数"、falseであれば"奇数"が返されます。

2-2. 条件式・真の場合の値・偽の場合の値の意味

三項演算子は、次の3つの部分に分けて考えると分かりやすいです。

C#
条件式 ? 真の場合の値 : 偽の場合の値

たとえば、次のコードを見てみましょう。

C#
int temperature = 30;

string message = temperature >= 28 ? "暑いです" : "過ごしやすいです";

それぞれの意味は次のとおりです。

C#
temperature >= 28

これは条件式です。

結果はtrueまたはfalseになります。

C#
"暑いです"

これは条件式がtrueだった場合に返される値です。

C#
"過ごしやすいです"

これは条件式がfalseだった場合に返される値です。

つまり、このコードは次のif文とほぼ同じ意味です。

C#
string message;

if (temperature >= 28)
{
message = "暑いです";
}
else
{
message = "過ごしやすいです";
}

2-3. 具体例:点数によって合格・不合格を表示する

点数によって「合格」または「不合格」を表示する例を見てみましょう。

C#
int score = 75;

string result = score >= 60 ? "合格" : "不合格";

Console.WriteLine(result);

このコードでは、score >= 60がtrueであれば"合格"、falseであれば"不合格"resultに代入されます。

実行結果は次のようになります。

C#
合格

if文で書くと次のようになります。

C#
int score = 75;
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

Console.WriteLine(result);

このように、単純な値の切り替えであれば、三項演算子を使うことでコードを短くできます。

2-4. 具体例:年齢によって表示メッセージを切り替える

次に、年齢によって表示メッセージを切り替える例です。

C#
int age = 20;

string message = age >= 20 ? "成人です" : "未成年です";

Console.WriteLine(message);

age >= 20がtrueなので、messageには"成人です"が代入されます。

実行結果は次のようになります。

C#
成人です

年齢を18に変えると、条件式はfalseになります。

C#
int age = 18;

string message = age >= 20 ? "成人です" : "未成年です";

Console.WriteLine(message);

実行結果は次のとおりです。

C#
未成年です

このように、C#の三項演算子は「条件に応じて表示内容を切り替えたい」ときに便利です。

3. 三項演算子とif文の違い

3-1. if文は処理の分岐、三項演算子は値の分岐に向いている

三項演算子とif文は、どちらも条件分岐に使えます。

しかし、得意な使い方が少し違います。

if文は、複数の処理を条件によって分けるのに向いています。

C#
if (score >= 60)
{
Console.WriteLine("合格です");
Console.WriteLine("おめでとうございます");
}
else
{
Console.WriteLine("不合格です");
Console.WriteLine("再チャレンジしましょう");
}

一方、三項演算子は、条件によって「値」を切り替えるのに向いています。

C#
string result = score >= 60 ? "合格です" : "不合格です";

つまり、ざっくり分けると次のように考えるとよいです。

C#
if文         処理を分岐する
三項演算子 値を分岐する

三項演算子は式なので、最終的に何らかの値を返します。

そのため、変数への代入、return文、出力文などでよく使われます。

3-2. if文で書いた処理を三項演算子に書き換える例

次のif文を見てみましょう。

C#
int score = 80;
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

このコードは、条件によってresultに代入する文字列を切り替えています。

三項演算子を使うと、次のように書き換えられます。

C#
int score = 80;

string result = score >= 60 ? "合格" : "不合格";

処理の内容は同じですが、三項演算子のほうが短くまとまっています。

別の例も見てみましょう。

C#
int number = 5;
string type;

if (number % 2 == 0)
{
type = "偶数";
}
else
{
type = "奇数";
}

三項演算子にすると、次のようになります。

C#
int number = 5;

string type = number % 2 == 0 ? "偶数" : "奇数";

「条件によって変数に入れる値を変えるだけ」の場合は、三項演算子と相性がよいです。

3-3. 三項演算子を使うとコードが短くなるケース

三項演算子を使うとコードが短くなる代表的なケースは、次のようなものです。

C#
bool isMember = true;

int price = isMember ? 900 : 1000;

会員なら900円、会員でなければ1000円という値を代入しています。

if文で書くと次のようになります。

C#
bool isMember = true;
int price;

if (isMember)
{
price = 900;
}
else
{
price = 1000;
}

この程度の単純な分岐であれば、三項演算子を使ったほうがすっきりします。

また、return文でも便利です。

C#
static string GetResult(int score)
{
return score >= 60 ? "合格" : "不合格";
}

このように、1行で自然に読める条件分岐なら、三項演算子を使う価値があります。

3-4. if文を使ったほうが読みやすいケース

三項演算子は便利ですが、条件や処理が複雑になると読みにくくなります。

たとえば、次のようなコードは一見して意味を理解しにくいです。

C#
string result = score >= 80 ? "優秀" : score >= 60 ? "合格" : "不合格";

この程度ならまだ読める場合もありますが、条件が増えるとさらに分かりにくくなります。

また、次のように処理を複数行で行いたい場合は、三項演算子ではなくif文を使うべきです。

C#
if (score >= 60)
{
Console.WriteLine("合格です");
SaveResult("合格");
}
else
{
Console.WriteLine("不合格です");
SaveResult("不合格");
}

三項演算子は値を返すための書き方です。

複数の処理を実行したい場合や、条件が複雑な場合は、if文を使ったほうが読みやすく安全です。

4. C#で三項演算子を使う代表的な場面

4-1. 変数への代入で使う

C#の三項演算子で最もよく使われるのが、変数への代入です。

C#
int score = 70;

string result = score >= 60 ? "合格" : "不合格";

このコードでは、scoreが60以上なら"合格"、そうでなければ"不合格"resultに代入されます。

数値の代入にも使えます。

C#
bool isMember = true;

int discount = isMember ? 500 : 0;

会員であれば割引額を500、会員でなければ0にしています。

このように、条件によって変数に入れる値を切り替える場合、三項演算子はとても便利です。

4-2. return文で使う

三項演算子は、メソッドのreturn文でもよく使われます。

C#
static string GetPassMessage(int score)
{
return score >= 60 ? "合格" : "不合格";
}

このメソッドは、点数が60点以上なら"合格"、それ以外なら"不合格"を返します。

if文で書くと次のようになります。

C#
static string GetPassMessage(int score)
{
if (score >= 60)
{
return "合格";
}
else
{
return "不合格";
}
}

単純な条件で値を返すだけなら、三項演算子を使うことでメソッドを短く書けます。

bool値を返すメソッドでも使えます。

C#
static bool IsAdult(int age)
{
return age >= 20 ? true : false;
}

ただし、この例はさらに簡単に書けます。

C#
static bool IsAdult(int age)
{
return age >= 20;
}

三項演算子を使わなくても自然に書ける場合は、無理に使う必要はありません。

4-3. Console.WriteLineで使う

三項演算子は、Console.WriteLineの中でも使えます。

C#
int score = 55;

Console.WriteLine(score >= 60 ? "合格" : "不合格");

このコードでは、score >= 60がtrueなら"合格"、falseなら"不合格"が表示されます。

文字列補間と組み合わせることもできます。

C#
int age = 18;

Console.WriteLine($"あなたは{(age >= 20 ? "成人" : "未成年")}です。");

この場合、三項演算子の部分を()で囲んでいます。

文字列補間の中で三項演算子を使う場合は、読みやすさのためにも括弧を付けたほうがよいです。

4-4. プロパティや式形式メンバーで使う

C#では、プロパティやメソッドを式形式で書くことがあります。

その中でも三項演算子はよく使われます。

C#
class User
{
public int Age { get; set; }

public string Category => Age >= 20 ? "成人" : "未成年";
}

このコードでは、CategoryプロパティがAgeの値に応じて"成人"または"未成年"を返します。

メソッドでも使えます。

C#
static string GetCategory(int age) => age >= 20 ? "成人" : "未成年";

式形式メンバーは短く書ける反面、複雑な処理を書くと読みにくくなります。

三項演算子を使う場合も、1行で意味が分かる程度にとどめるのがおすすめです。

4-5. nullチェックやデフォルト値の指定で使う

三項演算子は、nullチェックにも使えます。

C#
string? name = null;

string displayName = name != null ? name : "ゲスト";

Console.WriteLine(displayName);

nameがnullでなければnameを使い、nullであれば"ゲスト"を使います。

ただし、C#にはnullチェックをより簡潔に書ける??という演算子があります。

C#
string? name = null;

string displayName = name ?? "ゲスト";

Console.WriteLine(displayName);

nullの場合だけデフォルト値を使いたいのであれば、三項演算子より??のほうが読みやすいことが多いです。

一方で、null以外の条件も含めたい場合は三項演算子が使えます。

C#
string? name = "";

string displayName = string.IsNullOrEmpty(name) ? "ゲスト" : name;

この例では、nullだけでなく空文字の場合も"ゲスト"にしています。

5. 三項演算子を使うときの注意点

5-1. 複雑な条件式にすると読みにくくなる

三項演算子は短く書ける反面、条件式が複雑になると読みにくくなります。

C#
string result = score >= 60 && attendanceRate >= 80 ? "合格" : "不合格";

この程度ならまだ理解できます。

しかし、条件が増えると読みづらくなります。

C#
string result = score >= 60 && attendanceRate >= 80 && reportSubmitted ? "合格" : "不合格";

条件式が長くなる場合は、条件を変数に分けると読みやすくなります。

C#
bool canPass = score >= 60 && attendanceRate >= 80 && reportSubmitted;

string result = canPass ? "合格" : "不合格";

三項演算子そのものを短くしても、条件式が長すぎると意味が伝わりにくくなります。

読みやすさを優先することが大切です。

5-2. 真の場合と偽の場合の型に注意する

三項演算子では、trueの場合の値とfalseの場合の値の型に注意が必要です。

たとえば、次のようなコードはエラーになる場合があります。

C#
bool isNumber = true;

var value = isNumber ? 100 : "なし";

trueの場合はint、falseの場合はstringです。

このように型が違いすぎると、コンパイラがvalueの型を判断できません。

基本的には、trueの場合とfalseの場合で同じ型の値を返すようにしましょう。

C#
bool isNumber = true;

string value = isNumber ? "100" : "なし";

または、数値として扱うなら次のようにします。

C#
bool hasValue = true;

int value = hasValue ? 100 : 0;

三項演算子では「最終的にどの型の値を返すのか」を意識することが重要です。

5-3. 副作用のある処理は書かないほうがよい

三項演算子の中に、副作用のある処理を書くのは避けたほうがよいです。

副作用とは、変数の値を変更したり、データを保存したり、画面に出力したりするような処理のことです。

たとえば、次のような書き方はおすすめできません。

C#
bool isSuccess = true;

string message = isSuccess ? SaveData() : ShowError();

このようなコードは、何を目的としているのか分かりにくくなります。

処理を実行することが目的なら、if文を使ったほうが読みやすいです。

C#
if (isSuccess)
{
SaveData();
}
else
{
ShowError();
}

三項演算子は、あくまで値を切り替えるために使うのが基本です。

処理の実行を分岐したい場合は、if文を使いましょう。

5-4. 条件式の優先順位に注意する

三項演算子を他の演算子と組み合わせる場合は、優先順位に注意が必要です。

特に、文字列結合や計算式と一緒に使うと、意図が分かりにくくなることがあります。

C#
int score = 70;

Console.WriteLine("結果: " + score >= 60 ? "合格" : "不合格");

このようなコードは、意図したとおりに解釈されない可能性があります。

三項演算子を他の式の中で使う場合は、括弧を付けると安全です。

C#
int score = 70;

Console.WriteLine("結果: " + (score >= 60 ? "合格" : "不合格"));

括弧を付けることで、どの部分が三項演算子なのか明確になります。

初心者のうちは、三項演算子を使うときは積極的に括弧を付けるとよいです。

5-5. 可読性を優先してif文と使い分ける

三項演算子は便利ですが、最も大切なのは可読性です。

次のようなシンプルなコードなら、三項演算子は読みやすいです。

C#
string result = score >= 60 ? "合格" : "不合格";

しかし、次のようなコードは読みにくくなりがちです。

C#
string result = score >= 80 ? "優秀" : score >= 60 ? "合格" : attendanceRate >= 90 ? "再評価" : "不合格";

このような場合は、if文を使ったほうが分かりやすくなります。

C#
string result;

if (score >= 80)
{
result = "優秀";
}
else if (score >= 60)
{
result = "合格";
}
else if (attendanceRate >= 90)
{
result = "再評価";
}
else
{
result = "不合格";
}

短さよりも、読みやすさを優先しましょう。

特にチーム開発では、自分だけでなく他の人が読んでも理解しやすいコードを書くことが重要です。

6. 三項演算子のネストとは?

6-1. ネストは三項演算子の中に三項演算子を書くこと

三項演算子のネストとは、三項演算子の中にさらに三項演算子を書くことです。

たとえば、次のようなコードです。

C#
string result = score >= 80 ? "優秀" : score >= 60 ? "合格" : "不合格";

このコードでは、最初にscore >= 80を判定します。

trueであれば"優秀"を返します。

falseの場合は、さらにscore >= 60を判定します。

score >= 60がtrueなら"合格"、falseなら"不合格"を返します。

if文で書くと次のようになります。

C#
string result;

if (score >= 80)
{
result = "優秀";
}
else if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

6-2. ネストを使った複数条件の分岐例

三項演算子のネストを使うと、複数条件の分岐を1つの式で書けます。

C#
int score = 85;

string grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
score >= 60 ? "D" :
"F";

Console.WriteLine(grade);

このコードでは、点数に応じて成績を判定しています。

if文で書くと次のようになります。

C#
string grade;

if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else if (score >= 60)
{
grade = "D";
}
else
{
grade = "F";
}

ネストした三項演算子は、整形すればある程度読みやすくできます。

ただし、条件が増えすぎると理解しにくくなるため注意が必要です。

6-3. ネストが読みにくくなる理由

三項演算子のネストが読みにくくなる理由は、条件、trueの場合、falseの場合の対応関係が分かりにくくなるからです。

たとえば、次のコードを見てください。

C#
string message = age >= 20 ? isMember ? "成人会員" : "成人非会員" : "未成年";

このコードは短いですが、一目で意味を理解するのは少し大変です。

特に、?:が増えると、どの条件に対する分岐なのか追いにくくなります。

括弧を付けると少し分かりやすくなります。

C#
string message = age >= 20
? (isMember ? "成人会員" : "成人非会員")
: "未成年";

それでも、複雑な条件になる場合はif文のほうが読みやすいです。

6-4. ネストよりif文やswitch式を使ったほうがよいケース

条件が複数ある場合、三項演算子のネストよりif文やswitch式を使ったほうがよいことがあります。

たとえば、次のような条件分岐です。

C#
string grade;

if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else if (score >= 60)
{
grade = "D";
}
else
{
grade = "F";
}

このように条件が段階的に分かれている場合は、if文のほうが自然です。

また、値のパターンによって分岐するならswitch式も便利です。

C#
int level = 2;

string message = level switch
{
1 => "初級",
2 => "中級",
3 => "上級",
_ => "不明"
};

三項演算子は、2択のシンプルな分岐に向いています。

3つ以上の条件がある場合は、if文やswitch式を検討しましょう。

6-5. ネストを書く場合の整形例

どうしても三項演算子をネストして書く場合は、改行とインデントを使って整形すると読みやすくなります。

読みにくい例は次のとおりです。

C#
string grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "D";

整形すると、次のようになります。

C#
string grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
"D";

または、条件ごとに行を分けるとさらに見やすくなります。

C#
string grade =
score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
"D";

ただし、整形しても複雑に感じるなら、無理に三項演算子を使う必要はありません。

C#
string grade;

if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else
{
grade = "D";
}

読みやすさを優先して選ぶことが大切です。

7. 三項演算子と似たC#の構文

7-1. null合体演算子「??」との違い

C#には、三項演算子と似たように値を切り替える演算子として、null合体演算子??があります。

??は、左側の値がnullでなければ左側を返し、nullであれば右側を返します。

C#
string? name = null;

string displayName = name ?? "ゲスト";

Console.WriteLine(displayName);

これは、三項演算子で書くと次のような意味です。

C#
string displayName = name != null ? name : "ゲスト";

違いは、??はnullチェック専用であることです。

C#
string displayName = name ?? "ゲスト";

一方、三項演算子は任意の条件式を使えます。

C#
string displayName = string.IsNullOrEmpty(name) ? "ゲスト" : name;

nullの場合だけ処理を切り替えるなら??、それ以外の条件も使いたいなら三項演算子が向いています。

7-2. null条件演算子「?.」との違い

null条件演算子?.は、対象がnullでない場合だけメンバーにアクセスするための演算子です。

C#
User? user = null;

string? name = user?.Name;

このコードでは、userがnullならuser.Nameにアクセスせず、nameにはnullが入ります。

if文で書くと、次のような意味に近いです。

C#
string? name;

if (user != null)
{
name = user.Name;
}
else
{
name = null;
}

三項演算子でも似たように書けます。

C#
string? name = user != null ? user.Name : null;

ただし、nullチェックをしながら安全にアクセスしたい場合は、?.のほうが簡潔です。

C#
string? name = user?.Name;

?.はnull安全なアクセス、三項演算子は条件による値の切り替え、と考えると分かりやすいです。

7-3. switch式との違い

C#には、複数の条件に応じて値を返すswitch式もあります。

C#
int level = 2;

string message = level switch
{
1 => "初級",
2 => "中級",
3 => "上級",
_ => "不明"
};

switch式は、複数のパターンから値を選ぶときに便利です。

三項演算子でも複数条件を書けますが、ネストが必要になります。

C#
string message = level == 1 ? "初級" :
level == 2 ? "中級" :
level == 3 ? "上級" :
"不明";

この程度なら読める場合もありますが、条件が増えるとswitch式のほうが見やすくなります。

三項演算子は2択の分岐、switch式は複数パターンの分岐に向いていると考えるとよいです。

7-4. 条件分岐の目的に応じた使い分け

C#では、条件分岐の書き方がいくつもあります。

それぞれの目的に応じて使い分けることが大切です。

C#
// 2択で値を切り替える
string result = score >= 60 ? "合格" : "不合格";
C#
// nullの場合だけデフォルト値を使う
string displayName = name ?? "ゲスト";
C#
// nullでなければメンバーにアクセスする
string? userName = user?.Name;
C#
// 複数パターンで値を切り替える
string message = level switch
{
1 => "初級",
2 => "中級",
3 => "上級",
_ => "不明"
};
C#
// 複数の処理を条件で分ける
if (score >= 60)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}

三項演算子だけで何でも書こうとするのではなく、目的に合った構文を選ぶことが重要です。

8. 初心者がやりがちな三項演算子のエラーと対処法

8-1. 「:」を書き忘れる

三項演算子では、?:をセットで使います。

次のように:を書き忘れるとエラーになります。

C#
string result = score >= 60 ? "合格" "不合格";

正しくは次のように書きます。

C#
string result = score >= 60 ? "合格" : "不合格";

?の後にはtrueの場合の値、:の後にはfalseの場合の値を書きます。

C#
条件式 ? trueの場合 : falseの場合

三項演算子では、:を書き忘れないように注意しましょう。

8-2. 条件式にbool以外を指定してしまう

C#の三項演算子では、条件式の結果はboolである必要があります。

つまり、条件式はtrueまたはfalseになる式でなければなりません。

次のようなコードは正しくありません。

C#
int score = 80;

string result = score ? "合格" : "不合格";

scoreは数値であり、boolではありません。

正しくは、比較演算子を使って条件式にします。

C#
int score = 80;

string result = score >= 60 ? "合格" : "不合格";

C#では、数値をそのまま条件式として使うことはできません。

必ず、score >= 60count > 0のように、trueまたはfalseになる条件を書きましょう。

8-3. 代入と比較を間違える

条件式では、比較には==を使います。

初心者がよく間違えるのが、比較のつもりで=を書いてしまうことです。

C#
int level = 1;

string message = level = 1 ? "初級" : "その他";

このコードは正しくありません。

=は代入を表します。

比較したい場合は==を使います。

C#
int level = 1;

string message = level == 1 ? "初級" : "その他";

代入と比較の違いはとても重要です。

C#
=   // 代入
== // 等しいか比較

三項演算子の条件式では、多くの場合==!=>=<=><などの比較演算子を使います。

8-4. 戻り値の型が合わない

三項演算子では、trueの場合とfalseの場合で返す値の型が合わないとエラーになることがあります。

C#
bool isSuccess = true;

var result = isSuccess ? "成功" : 0;

このコードでは、trueの場合はstring、falseの場合はintです。

varを使っているため、コンパイラがresultの型を決められません。

対処法としては、同じ型にそろえます。

C#
bool isSuccess = true;

string result = isSuccess ? "成功" : "失敗";

数値として扱いたいなら、両方とも数値にします。

C#
bool isSuccess = true;

int code = isSuccess ? 1 : 0;

三項演算子を使うときは、返す値の型がそろっているか確認しましょう。

8-5. ネストが深すぎて意図しない結果になる

三項演算子をネストしすぎると、意図しない結果になることがあります。

C#
string result = score >= 80 ? "優秀" : score >= 60 ? "合格" : score >= 40 ? "再試験" : "不合格";

このコードは、条件が多くて読みづらいです。

読み間違えると、どの条件でどの値が返るのか分からなくなります。

このような場合は、if文に書き換えると分かりやすくなります。

C#
string result;

if (score >= 80)
{
result = "優秀";
}
else if (score >= 60)
{
result = "合格";
}
else if (score >= 40)
{
result = "再試験";
}
else
{
result = "不合格";
}

三項演算子のネストは、できるだけ浅く保つことが大切です。

読みづらいと感じたら、if文やswitch式に変更しましょう。

9. 三項演算子を使うべきか判断する基準

9-1. 1行で自然に読めるなら三項演算子

三項演算子を使うべきか迷ったときは、「1行で自然に読めるか」を基準にするとよいです。

たとえば、次のコードは自然に読めます。

C#
string result = score >= 60 ? "合格" : "不合格";

条件も返す値もシンプルです。

このような場合は、三項演算子を使うことでコードがすっきりします。

次のコードも分かりやすい例です。

C#
int fee = isMember ? 500 : 1000;

会員かどうかで料金を切り替えていることがすぐに分かります。

三項演算子は、短く書いても意味が明確な場合に使うのが基本です。

9-2. 条件が複数あるならif文やswitch式を検討する

条件が複数ある場合は、三項演算子よりif文やswitch式を検討しましょう。

三項演算子でも複数条件は書けます。

C#
string grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
"D";

ただし、条件が増えるほど読みにくくなります。

if文なら、条件の流れが分かりやすくなります。

C#
string grade;

if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else
{
grade = "D";
}

また、特定の値に応じて分岐するならswitch式も使えます。

C#
string message = level switch
{
1 => "初級",
2 => "中級",
3 => "上級",
_ => "不明"
};

2択なら三項演算子、複数条件ならif文やswitch式、という判断が分かりやすいです。

9-3. チーム開発では可読性を優先する

チーム開発では、自分だけが分かるコードではなく、他の人が読んでも理解しやすいコードを書く必要があります。

三項演算子を使うとコードは短くなりますが、読みやすくなるとは限りません。

たとえば、次のコードは短いですが、少し読みづらいです。

C#
string label = isActive ? hasPermission ? "利用可能" : "権限なし" : "停止中";

チームメンバーがすぐに理解できない可能性があります。

if文で書けば、条件の流れが明確になります。

C#
string label;

if (isActive)
{
if (hasPermission)
{
label = "利用可能";
}
else
{
label = "権限なし";
}
}
else
{
label = "停止中";
}

三項演算子を使うかどうかは、短さではなく読みやすさで判断しましょう。

特にレビューされるコードや長期間保守するコードでは、可読性が重要です。

9-4. 初心者はまずif文で考えてから置き換える

初心者のうちは、最初から三項演算子で書こうとしなくても大丈夫です。

まずはif文で考えると、処理の流れを理解しやすくなります。

C#
string result;

if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}

この処理が理解できたら、三項演算子に置き換えてみます。

C#
string result = score >= 60 ? "合格" : "不合格";

このように、if文から三項演算子へ変換する練習をすると、構文の意味がつかみやすくなります。

慣れてきたら、最初から三項演算子で書いても問題ありません。

ただし、読みにくいと感じたら、無理せずif文に戻しましょう。

まとめ

C#の三項演算子は、条件によって返す値を切り替えるための便利な構文です。

基本構文は次の形です。

C#
条件式 ? trueの場合の値 : falseの場合の値

たとえば、点数によって合格・不合格を切り替える場合は、次のように書けます。

C#
string result = score >= 60 ? "合格" : "不合格";

三項演算子は、if文より短く書ける場面があります。

特に、変数への代入、return文、Console.WriteLine、プロパティ、nullチェックなどでよく使われます。

一方で、複雑な条件式や深いネストに使うと、コードが読みにくくなります。

判断の基準は、1行で自然に読めるかどうかです。

シンプルな2択の値の分岐なら三項演算子、複数の処理や複雑な条件分岐ならif文やswitch式を使うとよいでしょう。

C#の三項演算子は、使いどころを理解すればコードをすっきり書ける便利な機能です。

まずはif文で処理を理解し、そのうえで三項演算子に置き換える練習をしていくと、自然に使い分けられるようになります。