ここでは、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 関数を使用する上では覚えておかなくてはいけないポイントです。