VB.NETに条件付き三項演算子はありますか?


446

Perl(およびその他の言語)では、条件付き3項演算子は次のように表現できます。

my $foo = $bar == $buz ? $cat : $dog;

VB.NETに同様の演算子はありますか?


13
三項演算子は、二項演算子が2つ、単項演算子が1つと同じように、3つのオペランドを取る任意の演算子です。?:演算子は三項演算子の具体例であり、定義ではありません。
ズーバ

回答:


597

バージョンによって異なります。IfVB.NET 2008 の演算子は、3項演算子(およびnull合体演算子)です。これは導入されたばかりで、2008年より前は使用できませんでした。ここではいくつかの詳細情報です: Visual Basicの場合は発表

例:

Dim foo as String = If(bar = buz, cat, dog)

[編集]

2008年以前はでしたIIf。これは、If上記のオペレーターとほぼ同じように機能しました。

例:

Dim foo as String = IIf(bar = buz, cat, dog)

15
2008年以前はIIfでした。これは、リンクで説明されているIf演算子とほぼ同じように機能しました。
ズーバ

128
...重要な違いは、関数であるIif()は常に結果と代替の両方を評価するのに対し、新しいIfはそれらの1つのみを評価することです。
グレッグ・ヒューギル09/02/23

6
それはどういう意味ですか?If(条件、true-part、false-part)。儀式してもいいですか?
kbvishnu 2012年

10
私は巨大なCの人ですが、この構文は従来の三項演算子よりもわかりやすいと思います。
クラッシュ

11
もう一つの重要な違いは:Iif常に型のオブジェクトを返すObjectのに対し、If(bool, obj, obj)オプション厳しい上で型チェックが可能になります。(Dim var As Integer = Iif(true, 1, 2)オプションstrict onでコンパイルすることはできませんDim var As Integer = Iif(true, new Object(), new Object())。簡単に書き込むことができるためです。Dim var As Integer = If(true, 1, 2)ただし、返された型をチェックするため、オプションstrictで書き込むことはできます。)
Joseph Nields

78

VB6であっても、iifは常にVBで使用できます。

Dim foo as String = iif(bar = buz, cat, dog)

そのため、これは真の演算子ではなく、Microsoft.VisualBasic名前空間の関数です。


31
Iifは3項演算子に近いだけですが、これは、If Then Else(または3項演算子)を使用するすべての条件で使用できるわけではありません。たとえば、Value = Iif(1 = 1、0、1/0)は爆発しますが、Value = If(1 = 1、0、1/0)は爆発しません...
ビープビープ

4
VBは短絡評価(AndAlso演算子を除く)をサポートしていないため、VBプログラマは、操作の半分を安全に評価できるとは期待していません。しかし、要点は、iifも後方互換性のために組み込まれたハック関数であり、それ以外の場合は本当の演算子になります。
クリスエリクソン、

39
すべてのVBプログラマーを分類するのは良いことです;-)また、ショートカットにはIsNotとOrElseもあるので、VBは実際に短絡評価をサポートしています。
HardCode、2009

2
Iifは通常のメソッド呼び出しであり、すべてのパラメーターを評価します。三項ではありません。Seの dotnetslackers.com/VB_NET/...
LosManos

3
すでに述べたように、これは真の演算子ではなく、vb6は短絡評価をサポートしていないため、常にすべての操作をオンラインで評価します。
クリスエリクソン

23

If()は最も近い同等物ですが、 "Option Strict off"を設定した場合、暗黙的な変換が行われることに注意してください

たとえば、慎重でない場合、次のようなことを試してみたくなるかもしれません。

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

「foo」の値は0になります。

私は思います '?' C#で同等の演算子は代わりにコンパイルに失敗します


8
完全を期すために、その式を記述するより良い方法はDim foo As Integer? = If( someTrueExpression, New Integer?, 2)です。
Mark Hurd、2015

9
これはでも発生することに注意してくださいOption Strict On。その理由はNothing、VB.NET default(T)ではでなくC#に相当するためnullです。
ハインツィ

1
そして、誰もが当惑のためにInteger?、それは、それがNULL可能だ意味-を参照してstackoverflow.com/questions/3628757/make-an-integer-null
AJV JSY

1
NULL可能なタイプのための暗黙的な変換で立ち往生、誰のために-参照理由としてこの回答および回避策については、この答えを返す前に引数をキャスト(CType(Nothing, DateTime?)を。
KyleMit 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.