2012-10-11 58 views
5

所以我剛纔看到這行代碼:是否有理由將其轉換爲可空類型?

Item = (int?)(int)row["Item"]; 

是否有一個原因,它不能僅僅是:

Item = (int?)row["Item"]; 
+1

嘗試一下,看看(當行[「Item」]'爲'null',包含'int'或其他東西)。 – Oded

+0

@Tonnie - 考慮到'row [「Item']'包含一個'object'試圖直接將它轉換爲一個可爲空的整數是個壞主意。 –

回答

6

請參閱Boxing Nullable Types (C#);一個對象可以直接轉換爲一個可爲空的int(但如果該對象實際上不是int,則會導致InvalidCastException)。這兩個強制轉換會執行的一件事情是直接轉換爲int?不會對null執行隱式檢查。

當投射到一個int然後到一個可爲空的int時,如果對象變量的值爲null,則會引發ICE。當直接轉換爲可空int時,null處理得很好,但如果代碼嘗試檢索Value屬性而未檢查實際是否存在InvalidOperationException,則將拋出InvalidOperationException。

這看起來像是一個半快速嘗試「快速失敗」,我不會推薦它作爲「好代碼」。只需直接轉換爲空,然後測試HasValue屬性並從那裏開始。

0
Item = (int?)(int)row["Item"]; 

此行拋出的情況下,row["Item"]例外是空的。這個壞主意,不要這樣做。

0

您可以使用as關鍵字。

Item = row["Item"] as int?; 
+0

如果'row [「Item」]''中包含的對象不是整數,則會導致InvalidCastException。此外,我不會使用任何一種方法,因爲既不能像這樣解決大量的繼承問題。 –

+3

@Ramhound:如果對象不是整數,則'as'運算符返回'null'。 –

+0

所以,這裏是大問題,'(int?)行[「項目」]'行'[「項目」]作爲int?'的優點是什麼? –

3

我相信寫這行代碼的正確方法是這樣的:

int val; 
var success = int.TryParse(Convert.ToString(row["Item"]), out val); 
Item = success ? (int?)val : (int?)null; 
0

實際上,你可以投null爲可空類型

Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"]; 

不能確定是什麼例外此可能會導致,但我用它沒有問題。

相關問題