2010-08-31 75 views
2

我遇到了可空類型的問題,所以我寫了下面的程序來演示我遇到的問題,並且被結果困惑了。下面是程序:爲什麼可空類型的行爲是這樣

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色值?

回答

1

它與一個字符串到一個整數的隱式轉換有關。

其他人被設置爲Nothing或者沒有Nothing作爲發送給它的對象,該對象沒有隱式轉換。字符串,但是,。

打開Option Strict再試一次。我打賭沒有打印。

+1

你是對的。 。 。哦,vb的歡樂 – 2010-08-31 18:16:05

2

GetNothingString返回一個string類型的對象。在嚴格關閉選項的情況下,VB.Net編譯器允許這樣做,但由於String不能直接分配給Nullable(Of Integer),它會插入代碼將字符串轉換爲整數。你可以用反射器來驗證它:例如當反編譯到VB.Net,代碼如下所示:

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

因爲這個轉換函數返回一個int(整數),而不是一個可空INT,返回不能沒有缺省值,但必須是有效的整數,0

從對象到整數轉換的代碼?OTOH,是直接投:

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

如果返回什麼比沒有別的DirectCast將失敗,並在運行時一個InvalidCastException從那個功能。