ここでは、VB.NET および C# での3項演算子の使用方法を掲載しています。
スポンサーリンク
C# の場合
C言語でお馴染みの 3項演算子は、C# でもサポートされています。記述方法も C 言語と同じです。
int score = 80; int average = 60; // 条件が真ならgood、偽ならbadが返される object ret = score > average ? "good" : "bad";
真と偽の場合で異なる型を返す
3項演算子を使用しているときに、真と偽のケースでそれぞれ違う型の値を返すことはできませんが、一旦 object 型に格納してからリターンすることで同じ型とみなされます。
お奨めはしませんが。。。
// 異なる型を返すことはできない(コンパイルエラー) //object ret = score > average ? new List<string>[1] : new Dictionary<string, string>[2]; // どうしても、異なる型を返したい場合の回避方法 object a = new List<string>[1]; object b = new Dictionary<string, string>[2]; object ret = score > average ? a : b;
VB.NET の場合
VB2008 からは C# と同様の記述方法が、If 演算子によってできるようになりました。それ以前では IIf 関数を使用していました。
Dim score As Integer = 80 Dim average As Integer = 60 Dim ret As Object ' 条件が真ならgood、偽ならbadが返される ret = If(score > average, "good", "bad") ※ 真と偽の場合に異なる型を返す方法は、前述の C# と同様の方法で回避可能
VB.NET ではなぜか、条件式を省略することができます。詳細はコメントを参照ください。
Dim ret As Object ' 条件式が省略されている場合で、両方にリターン値が設定してある場合は ' 必ず1番目の引数が返される ret = If("good", "bad") ' 1番目の引数が返される ret = If("good", Nothing) ' 1番目の引数がNothingの場合は2番目の引数が返される ret = If(Nothing, "bad") ' 両方Nothingの場合は、Nothing が返される ret = If(Nothing, Nothing)
VB2008 以前の場合は IIf 関数
VB2008 以前では IIf 関数を使用して 3項演算子の処理を行います。ここでは、IIf 関数特有の注意点を紹介します。下記のコードを見て下さい。System.DivideByZeroException 例外が発生してしまいます。
Dim number As Integer= 12 Dim divisor As Integer = 0 ' 例外発生 Dim ret As Integer = IIf(divisor <> 0, number \ divisor, 0)
IIf 関数では、条件 ( divisor <> 0 ) の真偽に関わらず、真のケースの演算 ( number \ divisor ) が行われます。先ほど紹介した If 演算子や C# ではそのようなことはありません。IIf 関数を使用する上では覚えておかなくてはいけないポイントです。