[ VB.NET / C# ] 3項演算子 ( VB2008 から IIf 関数は使わない )

Pocket

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

参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *