操作符'??'无法应用于类型为'System.DateTime'的操作数

13

我得到了以下错误:

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;
                            }

rewardList<EndServReward> 类型时,为什么会出现这种情况?如何解决?


6个回答

13

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


为什么 r.ServDate 不能为 null?!我想检查它们是否为空属性或未设置(填充)值。 - Anyname Donotcare
2
@just_name 这是为什么它不能为 null 的原因:http://msdn.microsoft.com/zh-cn/library/vstudio/1t3y8s4s.aspx - Hanky Panky
如果我没有设置这些属性并将其插入数据库,会出现错误吗? - Anyname Donotcare
1
DateTime 是一个结构体,保证被初始化为全部为零。全部为零等于 DateTime.MinValue(0000-01-01),这是将会插入到数据库中的值。 - Corak
1
@Corak - SqlServer 在 datetime 列中不接受 1753 年之前的年份。它会拒绝 DateTime.MinValue (0001-01-01)。 - Hans Kesting
@HansKesting - 当然,你是对的。我想我太习惯使用datetime2了。所以DateTime.MinValue就是“将尝试插入数据库的内容”。 - Corak

8

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

public DateTime? ServDate { get; set; }

默认情况下,DateTime不可为空


8

空合并运算符默认情况下无法应用于本质上不可为空的类型,比如DateTime。如果您希望仍然使用它,您需要将DateTime作为可空类型进行处理,例如使用DateTime? dt;


4

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

对于整数,双精度等值类型也是如此。

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

但是,您可以考虑将该值与基本值(如Min)进行比较。您实际上必须考虑此变量的默认值是否可接受,然后针对其进行检查。

同样,考虑一个int。 您不会将其与null进行比较,但您可以将其与零或负数进行比较。


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;

1
正如其他回答中所指出的那样,您不能在值类型——DateTime上使用Null-Coalescing运算符。
在尝试将myIfxCmd.Parameters[1].Value分配为Null之前,首先要问的是,在EndServReward类中,您设置了ServDate属性的默认值是什么?与其进行转换以获取null或DateTime.Min,不如在创建对象本身时为ServData设置默认值。这将有助于在一个地方决定功能并提供一致的解决方案。
在创建此对象时,您可以选择将其作为DateTime.Min或Null,而不是在将其更新到数据库时进行选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接