简体   繁体   中英

What is the difference between these 2 statements?

Possible Duplicate:
C# ?: Conditional Operator


statement first:

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

statement second:

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

What is difference between these two statements?

In first statement, if value is empty in if-else condition, then it stores null value correctly; but, if value is empty in the second condition, then instead of storing null value it stores 0 . AskingPriceFrom is a get-set field stores decimal value. I tried to convert only dr["AskingPriceFrom"] after the question mark but the statement gives me an error.

Is there any way to protect null value from converting in decimal ?

Apparently Convert.ToDecimal(null) == 0

//Edit: This should work

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

It's because Decimal is not nullable. You should cast to decimal? so that when you convert a null to that type it will not return the default value 0 but instead return null.

in the inline version( ternary ) if it is null you will get:

objFilters.AskingPriceFrom =  Convert.ToDecimal(null);

this will probably result an error.

You should read Convert.ToDecimal documentation here http://msdn.microsoft.com/en-us/library/e6440ed8.aspx .

Convert.ToDecimal returns decimal or throws exception, but in your case you need return type as Nullable<decimal> .

You can use code like this:

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

Thanks a lot to https://stackoverflow.com/users/1336654/jeppe-stig-nielsen . This is working properly.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM