2013-02-05 182 views
0

可能重複:
C# ?: Conditional Operator這兩條語句有什麼區別?


語句首先:

if(dr["AskingPriceFrom"]!=System.DBNull.Value) 
    objFilters.AskingPriceFrom=Convert.ToDecimal(dr["AskingPriceFrom"]); 
else 
    objFilters.AskingPriceFrom=null; 

聲明第二:

objFilters.AskingPriceFrom=Convert.ToDecimal(
    dr["AskingPriceFrom"]!=System.DBNull.Value ? dr["AskingPriceFrom"] : null 
    ); 

這兩種說法有什麼區別?

在第一條語句,當值的if-else條件,那麼它正確地存儲價值是空的;但是,如果在第二種情況下數值爲空,那麼它將存儲0而不是存儲null值。 AskingPriceFrom是一個get-set字段存儲的十進制值。我試圖在問號後只轉換dr["AskingPriceFrom"],但聲明給了我一個錯誤。

有什麼辦法來保護值從十進制轉換?

+0

在功能上,沒什麼不同。 – leppie

+0

在你的第二條語句中,你正在做一個轉換爲'null'的十進制數,它返回一個0.你應該在裏面移動convert語句。 – ryadavilli

+0

[C#?:Conditional Operator]的可能重複(http://stackoverflow.com/questions/1171717/c-sharp-conditional-operator) – CesarGon

回答

1

這是因爲十進制不能爲空。您應該將其轉換爲decimal?,這樣當您將null轉換爲該類型時,它不會返回默認值0,而是返回null。

+0

如果值爲空,則應該存儲NULL不爲0. – Suraj

+0

@Suraj不,因爲十進制是一個值類型不是引用類型,因此不能爲空。但是,如果你將它聲明爲'decimal?',它實際上將變成一個'Nullable ',它是一個引用類型,可以有一個空值。 – dutzu

2

顯然Convert.ToDecimal(null) == 0

//編輯:這應該工作

objFilters.AskingPriceFrom = 
     (dr["AskingPriceFrom"] != System.DBNull.Value) ? 
     Convert.ToDecimal(dr["AskingPriceFrom"]) : null; 
+0

錯誤「無法確定條件表達式的類型,因爲'decimal'和'bool'之間沒有隱式轉換」 – Suraj

+0

條件表達式的類型無法確定,因爲'decimal'和''之間沒有隱式轉換 – Suraj

+0

ok ,什麼類型是objFilters.AskingPriceFrom的? – hcb

0

在在線版(三元) 如果您將獲得:

objFilters.AskingPriceFrom = Convert.ToDecimal(null); 

這可能會導致錯誤。

+0

不,它給出'decimal'類型的零('0m'),然後將其包裝爲一個可以爲「HasValue」(即零)的可爲空的小數。 –

+0

你是對的,對於Convert.ToDecimal(對象)返回值,微軟曾說過:等於值的十進制數,如果值爲null,則爲0(零)。 –

0

您應該在這裏閱讀Convert.ToDecimal文檔http://msdn.microsoft.com/en-us/library/e6440ed8.aspx

Convert.ToDecimal返回decimal或拋出異常,但在你的情況下,你需要返回類型爲Nullable<decimal>

您可以使用這樣的代碼:

decimal? result; 
if (Convert.IsDBNull(dr["AskingPriceFrom"])) 
{ 
    result= null; 
} 
else 
{ 
    result = dr.GetDecimal(reader.GetOrdinal("AskingPriceFrom")); 
}