2015-06-25 63 views
1

我想我錯過了一些關於可空類型的基本概念。希望這個例子能夠開啓新的理解,但至少,也許我們可以讓這件事情正確地工作。爲什麼我的Nullable(Of Int32)= 0後,我將它設置爲Nothing?

在一類(對話形式),我聲明:

Property ProductStructureHeaderKey As Int32? 

在另一級,我聲明對話框的實例,並嘗試設置屬性與該行:

dr.ProductStructureHeaderKey = If(parentRow.Cells(1).Value Is Nothing, Nothing, Int32.Parse(parentRow.Cells(1).Value)) 

當該行爲該屬性賦值Nothing時,該屬性等於0.(然後,當我希望它傳遞NULL時,它將0傳遞給DB)。尋找代碼(SO,MSDN等),看起來像我正在做的事情,但顯然,我不是。所以,朋友們,我做錯了什麼?我如何使用Nullable類型來滿足我的需求?

+0

'DBNull'是不一樣的'Nothing';它可能有助於看到「稍後」部分應該可能通過'DBNull' – Plutonix

+0

我有其他地方的代碼處理Nothing到NULL轉換,問題實際上是將此Nullable設置爲Nothing。但蒂姆的回答指向了我愚蠢的錯誤。 – clweeks

回答

2

這是C#和VB.NET之間的區別之一。在VB.NET Nothing不僅意味着null而且default。所以你的Int32默認值分配到什麼是0。這是由具有從兩個值從您要分配的屬性推斷類型不是If-operator造成財產。

而是使用任一種If...Else

If parentRow.Cells(1).Value Is Nothing Then 
    dr.ProductStructureHeaderKey = Nothing ' Now it's not 0 but Nothing 
Else 
    dr.ProductStructureHeaderKey = Int32.Parse(parentRow.Cells(1).Value) 
End If 

或強制與new Nullable(Of Int32)可空:

dr.ProductStructureHeaderKey = If(parentRow.Cells(1).Value Is Nothing, new Nullable(Of Int32), Int32.Parse(parentRow.Cells(1).Value)) 

進一步讀:Why is there a difference in checking null against a value in VB.NET and C#?

+0

Arg!除非我錯過了一些東西,否則我實際上應該使用'= If(parentRow.Cells(1).Value,Nothing)'我一直在忘記使用三部分if()的這一複雜因素 - 非常令人沮喪。 – clweeks

+0

我不知道'parentRow'是什麼。 –

+0

僅當'parentRow.Cells(1).Value'返回'Nullable(Of Int32)'時,否則它不會使用Option Strict On進行編譯。它必須隱含地轉換爲'Int32?'。 –

相關問題