以下代码
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 Case
与Nothing
案例的可空值类型和案例子句一起使用?
答案 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