2011-01-04 86 views
3

これは愚かな質問ですが、私はVB.Netをあまりに長くプログラムしたと仮定しなければならないので、今度はC# null coalescing operatorに変換する方法を理解できませんVB.Net:VB.NetでNULL合体演算子(8)

if(Convert.ToBoolean(ViewState[tp.UniqueID + "_Display"] ?? true) == false){} 

私はIIF-Functionを知っているが、私はここでそれを使用するかどうかはわかりませんし、それが正しい結果を与えた場合(IIFに両方の式が評価されています)。暗闇に光を当てるのを助けてください。

EDITforums.asp.netは ありますがOption Strict On disallows implicit conversions from 'Object' to 'Boolean'コンパイラ例外を発生させるソリューションを見ることができます:あなたはこれのソースを見たい場合。

+1

これは、使用している三項演算子ではなく、null合体演算子です。つまり、演算子に残された部分がnullでない場合はその値を使用し、そうでない場合は右側の値を使用します。 –

+2

if条件の先頭に '!'(C#)または 'Not'(VB)を置き、' == false'を削除することをお勧めします。私はブール比較を見るのが嫌いです。 – juharr

+0

私はあなたのコメントを感謝しますが、時にはブール比較で可読性が向上します:) –

答えて

1

しばらくして、私は、これはあなたが欲しいものだと思う:

CBool(IIf(IsNothing(ViewState(tp.UniqueID + "_Display")), True, False)) 

EDITティム(OP)によって:

これは実際に等しいものですC#版

Not CBool(IIf(IsNothing(ViewState(tp.UniqueID + "_Display")), True, ViewState(tp.UniqueID + "_Display"))) 
+0

いいえ、彼はnullでない場合、ViewStateの値を変換したい。私はそれが "True"か "False"のいずれかの文字列であると思われます。 – juharr

+0

@juharr:値は何でもかまいません。ブール値は真/偽です。 @Mike:私は通常、IsNothing関数を避けますが、これはこの場合(VB8)のベスト/コンパクトなソリューションだと思います。 –

0

VBIIFを使用してください。

IIf Function Reference

IIF(
    IIF(Convert.ToBoolean(ViewState[tp.UniqueID + "_Display"] = Nothing, 
      True, 
      ViewState[tp.UniqueID + "_Display"]), 
    Success(), 
    Failure()) 
1

これは動作するはずです:

If (ViewState(tp.UniqueID + "_Display") IsNot Nothing OrElse Convert.ToBoolean(ViewState(tp.UniqueID + "_Display") = false) Then ... End If 

私は単純化するためのIIF演算子を使用していませんでした:)

+1

IIfはVB.NETの代替品ですが、C#にはVB.NETにはないものがあったので、確かにパッチではありませんでした。クラシックVB(C#よりずっと前にあった)はIIfステートメントも持っていました(VBAと共に)。 –

+1

VBには、しばらくの間、If *演算子*があります。これは、 '?:'条件演算子と '?'ヌル集合演算子の両方に相当します。 –

+0

これはC#とVB.Netを組み合わせたものです。もしそれを 'Convert.ToBoolean(IIf(ViewState(tp.UniqueID +" _Display "))に変更すると、Nothing、True、ViewState(tp。'Option Strict Onは 'Object'から 'Boolean'への暗黙的な変換を許可しない –

5

あなたがIf operator(未IIF関数を)したいです。

If Not ViewState[tp.UniqueID + "_Display"] is Nothing AndAlso Not CType(ViewState[tp.UniqueID + "_Display"],Boolean) Then 

End If 
:それはあなたが本当に好きな何かをしたい3つの引数または2


を渡されたかどうかに応じて、?:条件演算子とC#から?? null合体演算子の両方の同等として使用することができます

これは少なくともあなたに短絡を与えます。

+0

このヒントをありがとうが、残念ながらVS 2005を使用しなければならない –

+0

@ UniqueID +" _Display ")) Tim - その場合は、あなたが書いたコードにコメントを追加することをお勧めします。あなたのツールが更新されると、あなた(または他の将来のメンテナー)に変更を促すでしょう。 –

+0

あなたは正しいです。 VS 2005タグを追加しました。それが明確になることを願っています。 –

2

vb 9を使用している場合は"if" ternary operatorできます。

+0

このヒントをありがとう、残念ながら私はVS 2005を使用する必要があります –

0

あなたはこれをあまりにも難しくしようとしているかもしれません。これを試してみてください:

If ViewState[tp.UniqueID + "_Display"] = True Then ... 

覚えておいて、ViewStateが箱入りobjectを返し、何も互いに直接TrueFalseを比較するからあなたを停止しません。 Option Strict Offがある場合、= Trueは省略可能です。

あるいは

If Object.Equals(ViewState[tp.UniqueID + "_Display"], True) Then 
+0

私は今までOption Strictを持っています。だから、 'Option Strict On 'は' Object 'から' Boolean 'への暗黙的な変換を禁止する –

0

requestオブジェクトとString機能IsNullOrEmptyを使用します。

Dim display As Boolean = False 
If String.IsNullOrEmpty(Request.QueryString("UID")) Then 
    display = Convert.ToBoolean(Request.QueryString("UID")) 
End If 
0

提供された例は悪いので、事実上恥ずべきです。これは文字通り、括弧で囲まれた領域が実行されるかスキップされるかの2つの異なるコンテキストだけを評価する呼び出しを持ちます。ここで

は、より良いことを説明するために論理的な分析である:

  • 、真
  • 、偽:

    • のViewState [tp.UniqueID + "_Displayは"]と評価されますnull、または

    • その他

評価が偽であれば、null-coalesce操作は短絡され、 "== false"で真の評価が強制されます。次に、中かっこの内容が実行されます。

その評価が他のものである場合、評価はヌル - 合体して「真」になり、「==偽」で偽の評価が強制されます。次に、中かっこの内容はスキップされます。

だから実際元のソースを記述するために適切な、非常に簡単な方法は次のとおりです。

​​

は、注目すべきは、これはヌル・合体opertationを持っていません。

この問題は、この例では、NULL結合操作の使用を正当化することさえも不十分であり、操作をVisual Basicに変換する必要性を述べています。