2012-11-08 35 views
1

我試圖使用下面的代碼來檢查DBNull並將該變量設置爲空,如果是,則將其設置爲空,如果不是,則設置爲空。問題是它沒有將變量設置爲Nothing,而是將其設置爲0。任何人都知道爲什麼?設置一個變量爲空值inline if語句

variable = If(currentRow.Item("variable") Is DBNull.Value, 
    Nothing, CShort(currentRow.Item("variable"))) 

回答

4

如果variable聲明As Short?然後代碼工作有輕微的調整:你需要的If一個操作數轉換爲目標類型第一:

variable = If(condition, CType(Nothing, Short?), CShort(…)) 

(您也紛紛投第三操作數,或兩者兼而有之。)

由於If如何推導出類型,因此這種轉換是必需的:如果兩種結果類型不匹配,則推導出一種通用類型,即最接近父類型,即兩者都繼承的類型。然而,Nothing,新的規則發揮作用,因爲就VB而言,Nothing已經是一個有效的Short - 一個默認初始化(請參閱下面的舊答案的解釋)。所以VB不會嘗試任何類型的強制,它只是使用Short作爲返回值。


舊下面的答案,假設OP宣佈variable As Short

您不能設置值類型Nothing。如果您將Nothing指定爲值類型,那麼它將被設置爲其類型的默認值,而不是,即Short

您可以輕鬆地測試:

Dim s as Short = Nothing 
Console.WriteLine(s) 

值類型設置爲Nothing是一樣調用它的默認構造函數(New Short())或聲明該類型的新變量初始化沒有它。 C#中的相應操作將分配爲default(T)short s = default(short))。

如果你想表示null值類型,你必須使用nullable types

Dim s as Short? = Nothing 

現在sNullable<Short>型(Short?就是一個快捷鍵),可以分配適當Nothing

+0

沒錯,但我的變量已經在上面聲明(應該提到那個)爲「Short?」。那麼,這不應該工作嗎? – Tomcat

+0

@ user1335008啊。這改變了一切。等等,讓我編輯答案。 –

+0

太棒了,那正是我需要的! – Tomcat