我一直在用可空的整数来解决一些意想不到的行为。
Integer
设置为Nothing
,则会按预期变为Nothing
。 Integer?
设置为String
Nothing
,则它变为0! 当然,无论我是否明确地将String
转换为Integer?
,我都会得到这个。
我意识到我可以很容易地解决这个问题,但我想知道我错过了什么。
Dim NullString As String = Nothing
Dim NullableInt As Integer? = CType(NullString, Integer?) 'Expected NullableInt to be Nothing, but it's 0!
NullableInt = Nothing 'This works, of course. NullableInt is Nothing.
编辑:之前我在这里编写了代码,因此没有明确转换为Integer?
,而且每个人似乎都对此感到困惑/困惑。 Option Strict On有很多建议会抓住这类东西。然而,这实际上是字符串到整数转换规则的一个怪癖,它早于可空类型,但仍会影响它们。
答案 0 :(得分:6)
这里有与VB.Net转换规则有关的原因。 String
类型与Integer?
不兼容,因此会发生转化。然而,中间步骤是将String
转换为Integer
。 VB.Net转换规则会将Nothing
或空String
转换为Integer
值0.这可以在没有nullables的情况下重现
Dim local1 As String = Nothing
Dim local2 As Integer = local1 ' It's 0
然后,同样的转换会将Integer
值0转换为保持Integer?
值的Integer
类型。
答案 1 :(得分:0)
您为什么要将字符串分配给整数????
Dim nullInt As Nullable(Of Integer) 'nullInt = Nothing as expected
'the following should NOT compile and won't with Option Strict On
nullInt = ""
nullInt = String.Empty