将Nullable Integer设置为包含Nothing的字符串会产生0

时间:2010-12-14 17:09:40

标签: .net vb.net nullable

我一直在用可空的整数来解决一些意想不到的行为。

  • 如果我将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有很多建议会抓住这类东西。然而,这实际上是字符串到整数转换规则的一个怪癖,它早于可空类型,但仍会影响它们。

2 个答案:

答案 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