这是处理DBNull.value
的方法之一,
但是我想要一个使用null-coalescing运算符来处理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'
我可能会提出错误的问题,或者我的知识可能无效,即使如此,请让光明:)
答案 0 :(得分:2)
问题是DBNull.Value不为null。看来你想用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而失败,这比免费提供所有产品更好。
答案 1 :(得分:0)
decimal
是值类型,不能是null
。您只能使用??
运算符reference types.
您可以继续使用第一种方式,或者您可以执行以下操作:
decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal)