运算符 '??“不能应用于类型为”系统.日期时间“的操作数

本文关键字:日期 系统 时间 的操作数 操作数 类型 不能 运算符 应用于 | 更新日期: 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?相反,在创建对象本身时,最好将nullDateTime.Min设置为ServData的默认值。这将有助于在一个地方确定功能并提供一致的解决方案。

您可以选择它作为DateTime.Min,也可以在创建时选择Null,而不是在将其更新到数据库时。