4

嗯,这是一种处理方法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'

我可能会问错误的问题,或者问题可能在我的知识范围内无效,即使这样,请让灯亮起来:)

4

2 回答 2

2

问题是 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,这比免费赠送您的所有产品要好。

于 2014-01-25T07:55:03.877 回答
0

decimal是值类型,不能是null. 您可以??仅使用运算符reference types.您可以继续使用第一种方式,也可以执行以下操作:

decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal)
于 2014-01-25T07:45:46.790 回答