如何在DbNull.Value中使用collasce null运算符?

时间:2014-01-25 07:31:35

标签: c# ado.net dbnull null-coalescing-operator null-coalescing

这是处理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'

我可能会提出错误的问题,或者我的知识可能无效,即使如此,请让光明:)

2 个答案:

答案 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)