9

我收到以下错误:

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,为什么会发生这种情况,以及如何解决?

4

6 回答 6

13

??是空合并运算符。
将其应用于不能为 的值是没有意义的null

于 2013-10-27T14:24:18.250 回答
8

默认情况下,nullcoalescing 运算符不能应用于本质上不可为空的类型,例如DateTime. 如果您仍然希望使用它,则必须预见使用DateTime可空类型,例如DateTime? dt;

于 2013-10-27T14:24:56.697 回答
7

您的 r.ServDate 属性必须可以为空:

public DateTime? ServDate { get; set; }

DateTime 默认情况下不可为空

于 2013-10-27T14:27:29.210 回答
3

DateTime 是一个值类型。值类型不可为空——它们总是带有一些值。

这对于整数、双精度数等也是一样的。

您使用的运算符会检查该值是否为空,因此没有必要。

但是,您可能会考虑根据基值检查该值,例如 Min。您实际上必须考虑这个变量的默认值是什么,如果可以接受,然后检查它。

同样,考虑一个 int。你不检查它是否为空,但你可以检查它是否为零或负数。

于 2013-10-27T14:36:25.710 回答
3

您可以按照其他答案中的建议将类型更改为可为空,或者将这样的辅助方法添加到您的代码中:

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;
于 2013-10-27T14:36:41.157 回答
1

正如在其他答案中正确指出的那样,您不能在值类型-DateTime 上使用 Null-Coalescing 运算符。

在您尝试分配myIfxCmd.Parameters[1].Value之前Null。第一个问题是您在Class中设置ServDate属性的默认值是什么?EndServReward而是在创建对象本身时转换为nullDateTime.Min更好地设置默认值。ServData这将有助于在一个地方确定功能并提供一致的解决方案。

您可以在创建它时DateTime.MinNull在创建它时选择它,而不是在将它更新到数据库时选择它。

于 2013-10-27T15:24:01.227 回答