2013-01-31 18 views
6

考慮下面的代碼:帶空格的可空類型如果不能一起工作?

Dim widthStr As String = Nothing 

這工作 - width分配Nothing

Dim width As Nullable(Of Double) 
If widthStr Is Nothing Then 
    width = Nothing 
Else 
    width = CDbl(widthStr) 
End If 

但這並不 - width成爲0.0(雖然它似乎在邏輯上是相同的代碼):

Dim width As Nullable(Of Double) = If(widthStr Is Nothing, Nothing, CDbl(widthStr)) 

爲什麼?有什麼我可以做的嗎?

+0

你在C#中嘗試相同嗎? '翻番? width = widthStr!= null? Double.Parse(widthStr):(double?)null;' –

+0

請檢查http://stackoverflow.com/questions/14633824/nullable-type-with-inline-if-cannot-work-together http:// stackoverflow。 com/questions/2647558 /保存 - 雙變量中的空值 – spajce

+2

@HighCore - C#中的'null'和VB.Net中的'Nothing'*不等同。 '什麼都不是',大約'default(T)'。 –

回答

4

這一切歸結爲類型分析的表達式。

Nothing是VB.Net中的一個神奇的野獸。它與C#中的default(T)大致相同。

這樣,試圖確定爲以下的最佳類型時:

If(widthStr Is Nothing, Nothing, CDbl(widthStr)) 

第三個參數是Double類型。第二個參數是可轉換爲Double(因爲Nothing可以返回值類型的默認值)。因此,返回值If的類型被確定爲Double

只有之後,那件類型分析得出的結論是任何關注該表達式被分配的變量的類型。 Double可指定給Double?,不會有任何警告。


有讓您的If()表達的工作,你如何期望沒有乾淨方式。因爲在VB.Net中沒有相當於null。您需要(至少)在If的一側或另一個潛在結果中插入DirectCast(或等同物),以強制類型分析查看Double?而不是Double

+0

+1,儘管我不認爲我完全理解你的答案。你是否暗示這種內聯'If'是引擎蓋下的通用函數?這就是VS如何工作來推斷它的類型? – Neolisk

+0

@Neolisk - 自從第一次發佈以來,我已經編輯了幾次我的問題 - 您是否閱讀過最新版本? '如果'不是通用函數。但正如我所說,沒有什麼是一隻神奇的野獸。它是無類型的(本身),所以首先使用任何其他類型的信息。 –

+0

有趣的是,雖然我期望類型分析考慮方程左側的類型。無論如何,感謝這樣一個徹底的解釋。 – Neolisk

10

繼達的回答,乾淨的方式做到這一點是使用Nothing,但New Double?代替:

Dim width As Double? = If(widthStr Is Nothing, New Double?, CDbl(widthStr)) 

而現在的If表達的類型是正確的,這可以減少到:

Dim width = If(widthStr Is Nothing, New Double?, CDbl(widthStr)) 
+0

+1。感謝您的建議。爲了清晰起見,我通常不希望使用任何特殊字符。因此,Dim width As Nullable(Of Double)= If(widthStr Is Nothing,New Nullable(Of Double),CDbl(widthStr))'是更可取的。 – Neolisk

+0

我明白你的偏好不使用「特殊字符」(我不會使用任何類型的字符作爲變量 - 但我會用於常量),但在這種情況下,IDE會拋出引用'Nullable' (Of)'。 –

+0

你的意思是我的代碼不起作用嗎?它對我有用。 – Neolisk

相關問題