0

可能重复:
C# ?:条件运算符


先声明:

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条件下 value 为空,则正确存储null值;但是,如果在第二个条件下 value 为空,那么它不会存储null值,而是存储0. AskingPriceFrom是一个 get-set 字段存储十进制值。我试图仅dr["AskingPriceFrom"]在问号之后进行转换,但该语句给了我一个错误。

有没有办法保护值不转换为十进制

4

5 回答 5

2

显然Convert.ToDecimal(null) == 0

//编辑:这应该工作

objFilters.AskingPriceFrom =  
      (dr["AskingPriceFrom"] != System.DBNull.Value) ? 
       Convert.ToDecimal(dr["AskingPriceFrom"]) : null;
于 2013-02-05T07:56:34.123 回答
1

这是因为 Decimal 不可为空。您应该强制转换为,decimal?以便当您将 null 转换为该类型时,它不会返回默认值 0,而是返回 null。

于 2013-02-05T07:56:07.937 回答
0

在内联版本(三元)中,如果它为,您将获得:

objFilters.AskingPriceFrom =  Convert.ToDecimal(null);

这可能会导致错误。

于 2013-02-05T07:59:01.720 回答
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"));
}
于 2013-02-05T08:19:26.287 回答
0

非常感谢https://stackoverflow.com/users/1336654/jeppe-stig-nielsen。这工作正常。

objFilters.AskingPriceFrom = dr["AskingPriceFrom"] != System.DBNull.Value ? Convert.ToDecimal(dr["AskingPriceFrom"]) : (decimal?)null;
于 2013-02-05T09:03:02.440 回答