VB.Net中的null coalesce operator(8)

时间:2011-01-04 14:03:53

标签: c# vb.net visual-studio-2005 conditional-operator

我担心这是一个愚蠢的问题,但我必须假设我已经编程了VB.Net太长时间,现在无法弄清楚如何将此C# null coalescing operator转换为VB.Net:

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

我知道IIF-Function,但我不知道如何在这里使用它,如果它给出了正确的结果(在I​​IF中,两个表达式都在评估中)。请帮助揭开黑暗的光芒。

编辑:如果您想查看此内容的来源:forums.asp.net 在那里,您可以看到生成Option Strict On disallows implicit conversions from 'Object' to 'Boolean'编译器异常的解决方案。

8 个答案:

答案 0 :(得分:5)

你想要If operator(不是IIF功能)。它可以用作?:条件运算符和来自C#的??空合并运算符的等价物,具体取决于它是通过3个参数还是2


你真的想要这样的东西:

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

End If

至少还会让你短路。

答案 1 :(得分:2)

如果你使用vb 9,你可以"if" ternary operator

答案 2 :(得分:1)

过了一段时间,但我认为这就是你想要的:

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

编辑

这实际上等于C#版本

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

答案 3 :(得分:1)

这应该有效:

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

我没有使用IIf运算符来简化:)

答案 4 :(得分:0)

IIF使用VB

IIf Function Reference

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

答案 5 :(得分:0)

也许你试图让这个太难了。试试这个:

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

请记住,ViewState会返回一个带框的object,没有什么可以阻止您直接将TrueFalse进行比较。当您拥有= True时,Option Strict Off是可选的。

可选地

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

答案 6 :(得分:0)

String函数IsNullOrEmptyrequest对象一起使用。

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

答案 7 :(得分:0)

提供的例子很糟糕 - 很糟糕,实际上是可耻的。它实际上有一个调用只能评估两个不同的上下文,以确定一个括号内的区域是执行还是被跳过。

这是逻辑分析,以更好地解释:

  • ViewState [tp.UniqueID +“_ Display”]将评估为:

    • 假,
    • 真,
    • null或
    • 别的东西

如果评估为假,则使用发布的源,空合并操作会短路并强制在“== false”处进行真正的评估。然后执行花括号内容。

如果该评估是其他任何内容,那么评估null将合并为“true”并强制在“== false”处进行错误评估。然后跳过花括号内容。

所以 实际上 编写原始资源的正确且非常简单的方法是:

if( Convert.ToBoolean( ViewState[tp.UniqueID + "_Display"] ) == false) {
    // do something
}

值得注意的是,这没有null-coalesce opertation。

其中的问题是,该示例不足以证明使用null-coalesce操作,并且预测需要将操作“转换”为Visual Basic。