【问题标题】:How to use collasce null operator with DbNull.Value?如何将 collasce null 运算符与 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'

我可能会问错问题,或者问题可能是无效的

【问题讨论】:

  • 如果这个答案是您问题的最佳解决方案,您可以接受其中一个答案。

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


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 2021-05-27
      • 2021-06-02
      • 1970-01-01
      • 2021-06-16
      • 2011-07-29
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多