gpt4 book ai didi

c# - 如何将 collasce null 运算符与 DbNull.Value 一起使用?

转载 作者:行者123 更新时间:2023-11-30 17:01:09 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com