接线员'??'不能应用于'System.DateTime'类型的操作数

时间:2013-10-27 14:22:22

标签: c# asp.net collections foreach operators

我收到以下错误:

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

6 个答案:

答案 0 :(得分:13)

??是null-coalescing运算符 将它应用于不能为null的值是没有意义的。

答案 1 :(得分:7)

默认情况下,nullgalescing运算符不能应用于像DateTime这样本质上不可为空的类型。无论如何,如果您希望使用它,您必须预见使用DateTime作为可空类型,例如使用DateTime? dt;

答案 2 :(得分:4)

您的r.ServDate属性需要可以为空:

public DateTime? ServDate { get; set; }

默认情况下,DateTime不可为空

答案 3 :(得分: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;

答案 4 :(得分:2)

DateTime是ValueType。值类型不可为空 - 它们总是带有一些价值。

对于整数,双精度等,这是相同的。

您正在使用的运算符检查值是否为null,因此没有必要。

但是,您可以考虑根据基本值检查值,例如Min。您实际上要考虑此变量的默认值(如果可接受),然后检查它。

再次考虑一个int。您不会将其检查为null,但您可以针对零或否定进行检查。

答案 5 :(得分:1)

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

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

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