作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是处理 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'
我可能会问错问题,或者根据我的知识该问题可能无效,即使这样也请让光亮:)
最佳答案
问题在于 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 而失败,这比提供所有产品要好免费离开。
关于c# - 如何将 collasce null 运算符与 DbNull.Value 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21347944/
这是处理 DBNull.value 的方法之一,但我想要一种使用空合并运算符的语法来处理 DBNull.value 这会起作用 decimal UnitPrice = row["UnitPrice"]
我是一名优秀的程序员,十分优秀!