在VB.NET中是否可以将Select Case与可为空的值一起使用?
下面的代码在VB.NET中是否可以将Select Case与可为空的值一起使用?,vb.net,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 S
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
Sub-Foo(i作为Int32?)
选择案例一
无案例“只是解决方法
Sub-Foo(i作为Int32?)
Dim value=i.GetValuerDefault(Integer.MinValue)
选择案例值
Case Integer.MinValue'为空
“做点什么
案例0
“做点别的吧
其他情况
“做点不同的事情
结束选择
端接头
另一个解决方法是
子Foo(i作为整数?)
如果i.HasValue=False,则
ExecuteIfNoValue()
出口接头
如果结束
选择案例一。价值
案例0
'如果0,则执行
其他情况
“做点别的吧
结束选择
端函数
在C#7中,switch
语句已经接受了其他then基元类型,并且可以使用nullable。
因此,您可以仅为此方法创建C#project,并使用C#7:)的新功能
void Foo(int?i)
{
开关(一)
{
大小写为空:
//ExecuteIfNoValue();
打破
案例0:
//ExecuteIfZero();
打破
违约:
//ExecuteIfDefault();
}
}
这是我目前使用的解决方法。我期待着在多个case
条款的情况下,采用重复性较小的其他解决方案:
Select Case True
Case i Is Nothing
' Do something
Case i = 0
' Do something else
Case Else
' Do something different
End Select
我想你的情况确实需要它,但是你真的需要I上的可空符号吗??如果没有它,你仍然可以把“什么都没有”传递给我
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
在这种情况下,我更希望看到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
有趣case null
在C#中很好。@JamesThorpe:这可能是由于不同的默认相等实现myObject==null
在C#中工作,myObject=Nothing
在VB中不工作myObject是Nothing(无)
在后一种情况下是必需的。对,这是有意义的,当我看这个时,我尝试了case I是Nothing(无)
,它不会与Foo(无)
匹配,但与Foo(0)
匹配case是
和是Nothing(无)
之间有趣的冲突。本来应该是的情况是什么都不是
,不幸的是是
不在其中。可能值得一个功能请求。这是一个有效的解决方法,但使用一个幻数有点违背了一开始就有一个可为空值的目的。@Heinzi-true,这就是我“标记”的原因作为解决方法:)如果MinValue
也是进入Select
的一个有效值,这就不起作用了。这种语法在我读它的头几次时总是让我的大脑陷入一个循环。我很确定这不会像你期望的那样,由于将Nothing
分配给值类型只会最终为该类型分配默认值(0
用于Int32
)。您是正确的—“Case Nothing”和“Case 0”是等效的,因此您无法使用此.M获得Case 0。Ferry和@BradleyUffner:注意,OP在类型后面加了?
,这是创建的缩写。因此,在他的案例中,没有任何东西与案例0不一样。我知道这一点,但这个答案询问是否真的需要null
。我是说“是的,它是”,否则这个答案中的代码是无效的。我也知道,但问OP是否真的需要它。不管怎样,我的答案确实是无效的,因为@BradleyUffner指出的原因。