C# 这两种说法的区别是什么?

C# 这两种说法的区别是什么?,c#,if-statement,conditional-operator,C#,If Statement,Conditional Operator,可能重复: 首先发言: if(dr["AskingPriceFrom"]!=System.DBNull.Value) objFilters.AskingPriceFrom=Convert.ToDecimal(dr["AskingPriceFrom"]); else objFilters.AskingPriceFrom=null; 声明二: objFilters.AskingPriceFrom=Convert.ToDecimal( dr["AskingPriceF

可能重复:


首先发言:

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条件中的值为空,则正确存储null值;但是,如果第二个条件中的值为空,则它存储的不是null值,而是
0
AskingPriceFrom
是一个获取集字段,用于存储十进制值。我试图在问号后仅转换
dr[“AskingPriceFrom”]
,但该语句给了我一个错误


有没有办法保护空值不被转换成十进制?

这是因为十进制不可为空。您应该强制转换为十进制?,这样当您将空值转换为该类型时,它将不会返回默认值0,而是返回空值。

这是因为十进制值不可为空。您应该强制转换为十进制?,这样当您将空值转换为该类型时,它不会返回默认值0,而是返回空值。

显然
convert.ToDecimal(null)==0

//编辑:这应该有用

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

显然
Convert.ToDecimal(null)==0

//编辑:这应该有用

objFilters.AskingPriceFrom =  
      (dr["AskingPriceFrom"] != System.DBNull.Value) ? 
       Convert.ToDecimal(dr["AskingPriceFrom"]) : null;
在内联版本中(三元) 如果为null,您将得到:

objFilters.AskingPriceFrom =  Convert.ToDecimal(null);
这可能会导致错误。

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

objFilters.AskingPriceFrom =  Convert.ToDecimal(null);

这可能会导致错误。

您应该阅读此处的
Convert.ToDecimal
文档

Convert.ToDecimal
返回
decimal
或引发异常,但在您的情况下,您需要返回类型为
Nullable

您可以使用如下代码:

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

您应该阅读此处的
Convert.ToDecimal
文档

Convert.ToDecimal
返回
decimal
或引发异常,但在您的情况下,您需要返回类型为
Nullable

您可以使用如下代码:

decimal? result;
if (Convert.IsDBNull(dr["AskingPriceFrom"]))
{
   result= null;
}
else
{
   result = dr.GetDecimal(reader.GetOrdinal("AskingPriceFrom"));
}
非常感谢你。这是正常工作

objFilters.AskingPriceFrom = dr["AskingPriceFrom"] != System.DBNull.Value ? Convert.ToDecimal(dr["AskingPriceFrom"]) : (decimal?)null;
非常感谢你。这是正常工作

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

从功能上讲,没有什么不同。在第二个语句中,您正在执行一个转换为十进制的
null
,它返回一个0。您应该将convert语句移到内部。在功能上可能与的重复,没有什么不同。在第二个语句中,您正在执行转换为十进制的
null
,它返回一个0。您应该将convert语句移到内部。可能存在重复的错误。“无法确定条件表达式的类型,因为'decimal'和'bool'之间没有隐式转换”无法确定条件表达式的类型,因为“decimal”和“If decimal Type”之间没有隐式转换。如果decimal Type不能为null,那么它在第一条语句中存储null值的方式如何?它在同一型号下工作正常。我认为在第二个语句中,我们需要避免将null转换为十进制。有可能吗?@Suraj重复一下,hcb的解决方案是正确的,只是他必须符合要推断的
?:
表达式的类型。这将起作用:
objFilters.AskingPriceFrom=dr[“AskingPriceFrom”]!=System.DBNull.Value?(十进制?)转换为十进制(dr[“AskingPriceFrom”]):null。这也会起作用:
objFilters.AskingPriceFrom=dr[“AskingPriceFrom”]!=System.DBNull.Value?Convert.ToDecimal(dr[“AskingPriceFrom”]):(十进制?)null@Suraj有关为什么hcb的答案需要此扭曲。错误的解释,请参阅。“无法确定条件表达式的类型,因为'decimal'和'bool'之间没有隐式转换”无法确定条件表达式的类型,因为“decimal”和“If decimal Type”之间没有隐式转换。如果decimal Type不能为null,那么它在第一条语句中存储null值的方式如何?它在同一型号下工作正常。我认为在第二个语句中,我们需要避免将null转换为十进制。有可能吗?@Suraj重复一下,hcb的解决方案是正确的,只是他必须符合要推断的
?:
表达式的类型。这将起作用:
objFilters.AskingPriceFrom=dr[“AskingPriceFrom”]!=System.DBNull.Value?(十进制?)转换为十进制(dr[“AskingPriceFrom”]):null。这也会起作用:
objFilters.AskingPriceFrom=dr[“AskingPriceFrom”]!=System.DBNull.Value?Convert.ToDecimal(dr[“AskingPriceFrom”]):(十进制?)null@Suraj有关hcb的答案为什么需要这种扭曲的解释,请参阅。如果值为空,则它应该存储NULL而不是0。@Suraj否,因为decimal是值类型而不是引用类型,因此不能为NULL。但如果您将它声明为
decimal?
它实际上将成为一个
可为null的
,它是一个引用类型,可以有一个null值。如果值为空,它应该存储null而不是0。@Suraj否,因为decimal是一个值类型而不是引用类型,因此不能为null。但是,如果您将其声明为
decimal?
它实际上将成为一个
可空的
,这是一个引用类型,可以有一个空值。不,它给出了类型为
decimal
的零(
0m
),然后将其包装为一个
有值
(即零)的可空的十进制数。对于Convert.ToDecimal(object)返回值,微软曾经说过:一个等于value的十进制数,或者如果value为null,则为0。不,它给出类型为
decimal
的零(
0m
),然后将其包装为一个可为null的十进制数,该十进制数
HasValue
(即零)。对于Convert.ToDecimal(object)返回值,微软曾经说过:一个十进制数,相当于一个值,如果值为空,则为0(零)。