运算符 '??“不能应用于类型为”系统.日期时间“的操作数
本文关键字:日期 系统 时间 的操作数 操作数 类型 不能 运算符 应用于 | 更新日期: 2023-09-27 18:37:11
我收到以下错误:
Operator '??' cannot be applied to operands of type 'System.DateTime'
foreach (EndServReward r in reward)
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
myIfxCmd.Parameters[0].Value = r.EmpNum ;
myIfxCmd.Parameters[1].Value = (r.ServDate) ?? DBNull.Value;
}
reward is List<EndServReward> reward
在哪里,为什么会发生这种情况,以及如何解决?
??
是空合并运算符。
将其应用于无法null
的值是没有意义的。
默认情况下,不能将 null 合并运算符应用于本质上不可为空的类型,如 DateTime
。如果你想使用它,你必须预见使用DateTime
作为可为空的类型,例如使用 DateTime? dt;
你的 r.ServDate 属性需要为空:
public DateTime? ServDate { get; set; }
默认情况下,日期时间不可为空
DateTime 是一个 ValueType。值类型不可为空 - 它们始终带有一些值。
对于整数、双精度等也是如此。
您使用的运算符检查值是否为 null,因此没有必要。
但是,您可以考虑根据基值(如 Min)检查该值。您实际上必须考虑此变量的默认值是什么(如果可以接受),然后对其进行检查。
再次,考虑一个整数。您不会根据 null 检查它,但您可以根据零或负数检查它。
您可以按照其他答案中的建议将类型更改为可为空,也可以将如下所示的帮助程序方法添加到代码中:
private bool IsDefault<T>(T value)
{
if (value == null)
return false;
return value.Equals(default(T));
}
然后将代码更改为以下内容:
myIfxCmd.Parameters[1].Value = IsDefault<DateTime>(r.ServDate) ? (object)DBNull.Value : (object)r.ServDate;
正如在其他答案中正确指出的那样,您不能对值类型 -DateTime 使用 Null-Cousscing 运算符。
在尝试使用 Null
分配myIfxCmd.Parameters[1].Value
之前。第一个问题是您在类中设置ServDate
属性的默认值是什么EndServReward
?相反,在创建对象本身时,最好将null
或DateTime.Min
设置为ServData
的默认值。这将有助于在一个地方确定功能并提供一致的解决方案。
您可以选择它作为DateTime.Min
,也可以在创建时选择Null
,而不是在将其更新到数据库时。