所以我剛纔看到這行代碼:是否有理由將其轉換爲可空類型?
Item = (int?)(int)row["Item"];
是否有一個原因,它不能僅僅是:
Item = (int?)row["Item"];
所以我剛纔看到這行代碼:是否有理由將其轉換爲可空類型?
Item = (int?)(int)row["Item"];
是否有一個原因,它不能僅僅是:
Item = (int?)row["Item"];
請參閱Boxing Nullable Types (C#);一個對象可以直接轉換爲一個可爲空的int(但如果該對象實際上不是int,則會導致InvalidCastException)。這兩個強制轉換會執行的一件事情是直接轉換爲int?
不會對null執行隱式檢查。
當投射到一個int然後到一個可爲空的int時,如果對象變量的值爲null,則會引發ICE。當直接轉換爲可空int時,null處理得很好,但如果代碼嘗試檢索Value屬性而未檢查實際是否存在InvalidOperationException,則將拋出InvalidOperationException。
這看起來像是一個半快速嘗試「快速失敗」,我不會推薦它作爲「好代碼」。只需直接轉換爲空,然後測試HasValue屬性並從那裏開始。
Item = (int?)(int)row["Item"];
此行拋出的情況下,row["Item"]
例外是空的。這個壞主意,不要這樣做。
您可以使用as
關鍵字。
Item = row["Item"] as int?;
如果'row [「Item」]''中包含的對象不是整數,則會導致InvalidCastException。此外,我不會使用任何一種方法,因爲既不能像這樣解決大量的繼承問題。 –
@Ramhound:如果對象不是整數,則'as'運算符返回'null'。 –
所以,這裏是大問題,'(int?)行[「項目」]'行'[「項目」]作爲int?'的優點是什麼? –
我相信寫這行代碼的正確方法是這樣的:
int val;
var success = int.TryParse(Convert.ToString(row["Item"]), out val);
Item = success ? (int?)val : (int?)null;
實際上,你可以投null
爲可空類型
Item = sdr.IsDBNull(sdr.GetOrdinal("Item")) ? (int?)null : (int)row["Item"];
不能確定是什麼例外此可能會導致,但我用它沒有問題。
嘗試一下,看看(當行[「Item」]'爲'null',包含'int'或其他東西)。 – Oded
@Tonnie - 考慮到'row [「Item']'包含一個'object'試圖直接將它轉換爲一個可爲空的整數是個壞主意。 –