如何将 collasce null 运算符与 DbNull.Value 一起使用?
Posted
技术标签:
【中文标题】如何将 collasce null 运算符与 DbNull.Value 一起使用?【英文标题】:How to use collasce null operator with DbNull.Value? 【发布时间】:2014-02-16 08:22:02 【问题描述】:这是处理DBNull.value
的方法之一,
但我想要一个使用空合并运算符的语法来处理DBNull.value
这会起作用
decimal UnitPrice = row["UnitPrice"] == DBNull.Value ? 0.00m : (decimal)row["UnitPrice"];
这些我都试过了,都不行,
decimal UnitPrice = (decimal)row["UnitPrice"] ?? 0.00m
UnitPrice = Convert.ToDecimal(row["UnitPrice"]) ?? 0.00m
UnitPrice = Decimal.Parse(row["UnitPrice"].ToString()) ?? 0.00m
我收到了
Operator '??' cannot be applied to operands of type 'decimal' and 'decimal'
我可能会问错问题,或者问题可能是无效的
【问题讨论】:
如果这个答案是您问题的最佳解决方案,您可以接受其中一个答案。 【参考方案1】:问题是 DBNull.Value 不为空。您似乎想用 0.0m 替换 DBNull.Value,但更好的解决方案是使用可为空的类型。也就是说,使用decimal?
而不是decimal
。然后可以使用as
运算符:
decimal? unitPrice = row["UnitPrice"] as decimal?;
如果你不能这样做,你可以这样做:
decimal unitPrice = (row["UnitPrice"] as decimal?) ?? 0.0m
或
decimal unitPrice = (row["UnitPrice"] as decimal?).GetValueOrDefault();
如果你经常这样做,辅助函数会使其稍微不那么冗长:
T FromObject<T>(object o) where T : struct return (o as T?).GetValueOrDefault();
然后
decimal unitPrice = FromObject<decimal>(row["UnitPrice"]);
如果你需要一个非零的默认值:
T FromObject<T>(object o, T defaultValue) where T : struct
return (o as T?).GetValueOrDefault(defaultValue);
然后
decimal unitPrice = FromObject<decimal>(row["UnitPrice"], Decimal.MinValue);
这种方法的缺点是,如果您更改数据库列的基础类型,您将开始得到虚假零而不是异常。这是因为如果对象例如是1.2f
,那么o as decimal?
将返回null,然后将其替换为0.0m。但是,o == DBNull.Value ? 0.0m : (decimal)o
表达式将等效于 (decimal)(object)1.2f
,这将失败并出现 InvalidCastException,这比免费赠送您的所有产品要好。
【讨论】:
【参考方案2】:decimal
是值类型,不能是null
。您可以仅使用 ??
运算符和 reference types.
您可以继续使用第一种方式,也可以执行以下操作:
decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal)
【讨论】:
以上是关于如何将 collasce null 运算符与 DbNull.Value 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章