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(零)。