是否可以在VB.NET中使用具有可空值的Select Case?

时间:2017-04-10 12:35:18

标签: vb.net

以下代码

Sub Foo(i As Int32?)
    Select Case i
        Case Nothing              ' <-- warning here
            ' Do something
        Case 0
            ' Do something else
        Case Else
            ' Do something different
    End Select
End Sub

产生以下警告:

  

警告BC42037:此表达式将始终求值为Nothing(由于equals运算符的空传播)。要检查值是否为null,请考虑使用“Is Nothing”。

但是,

Case Is Nothing会产生语法错误:

  

错误BC30239:期望关系运算符。

有没有办法将Select CaseNothing案例的可空值类型和案例子句一起使用?

4 个答案:

答案 0 :(得分:4)

这是我目前使用的解决方法。我期待在多个Case子句的情况下重复性较低的其他解决方案:

Select Case True
    Case i Is Nothing
        ' Do something
    Case i = 0
        ' Do something else
    Case Else
        ' Do something different
End Select

答案 1 :(得分:2)

解决方法

Sub Foo(i As Int32?)
    Dim value = i.GetValueOrDefault(Integer.MinValue)
    Select Case value 
        Case Integer.MinValue ' is Nothing
            ' Do something
        Case 0
            ' Do something else
        Case Else
            ' Do something different
    End Select
End Sub

另一种解决方法可以是

Sub Foo(i As Integer?)
    If i.HasValue = False Then 
        ExecuteIfNoValue()
        Exit Sub
    End If

    Select Case i.Value
        Case 0
            ' Execute if 0
        Case Else
            ' Execute something else
    End Select
End Function

在C#7 switch语句中已经接受了其他原语类型,并且可以使用nullable 因此,您只能为此方法创建C#项目并使用C#7的新功能:)

void Foo(int? i)
{
    switch(i)
    {
        case null:
            // ExecuteIfNoValue();
            break;
        case 0:
            // ExecuteIfZero();
            break;
        default:
            // ExecuteIfDefault();          
    }
}

答案 2 :(得分:2)

在这种情况下,我更愿意看到Select包裹在If中。对我来说,这感觉更具可读性和逻辑性,因为缺少值通常需要不同于存在值的行为类型。

Sub Foo(i As Int32?)
    If i.HasValue Then
        Select Case i
            Case 0
                ' Do something else
            Case Else
                ' Do something different
        End Select
    Else
        ' Do something
    End if
End Sub

答案 3 :(得分:-1)

我认为你的情况可能确实需要它 - 但你真的需要我的可空符号吗?你仍然可以通过&#34; Nothing&#34;我没有它。

Sub Test()
    Foo(Nothing)
End Sub

Sub Foo(i As Int32)
    Select Case i
       Case Nothing
           'do something
       Case 0
           'do something else
       Case Else
           'do something different
    End Select
End Sub