Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET中是否可以将Select Case与可为空的值一起使用?_Vb.net - Fatal编程技术网

在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指出的原因。