我遇到了可以为空的类型的问题所以我编写了以下程序来演示我遇到的问题并且对结果感到困惑。这是程序:
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有值?
答案 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打开的情况下再次尝试。我打赌没有打印。