为什么可空类型的行为方式如此

时间:2010-08-31 17:55:29

标签: .net vb.net nullable

我遇到了可以为空的类型的问题所以我编写了以下程序来演示我遇到的问题并且对结果感到困惑。这是程序:

Module Module1

Public Sub Main()
    Dim i As Integer? = Nothing
    Dim j As Integer? = GetNothing()
    Dim k As Integer? = GetNothingString()

    If i.HasValue Then
        System.Console.WriteLine(String.Format("i has a value of {0}", i))
    End If
    If j.HasValue Then
        System.Console.WriteLine(String.Format("j has a value of {0}", j))
    End If
    If k.HasValue Then
        System.Console.WriteLine(String.Format("k has a value of {0}", k))
    End If

    System.Console.ReadKey()

End Sub

Public Function GetNothingString() As String
    Return Nothing
End Function

Public Function GetNothing() As Object
    Return Nothing
End Function

End Module

该计划的输出是:   k的值为0

为什么只有k有值?

2 个答案:

答案 0 :(得分:2)

GetNothingString返回string类型的对象。关闭选项严格,VB.Net编译器允许这样做,但由于String不能直接分配给Nullable(Of Integer),它会插入代码将字符串转换为整数。您可以使用反射器进行验证:例如当反编译为VB.Net时,代码如下所示:

Dim k As Nullable(Of Integer) = Conversions.ToInteger(Module1.GetNothingString)

由于此转换函数返回int(整数),而不是nullable int,因此返回的默认值不能为Nothing,但必须是有效整数0。

从对象转换为Integer?,OTOH的代码是直接转换:

Dim j As Nullable(Of Integer) = DirectCast(Module1.GetNothing, Nullable(Of Integer))

如果从该函数返回Nothing以外的任何内容,则DirectCast将在运行时因InvalidCastException而失败。

答案 1 :(得分:1)

它与字符串隐式转换为整数有关。

其他人直接设置为Nothing或者没有任何内容作为发送给它的对象,它没有隐式转换。但是,字符串可以。

在Option Strict打开的情况下再次尝试。我打赌没有打印。