2013-02-05 91 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")); 
}