2013-10-27 62 views
6

我得到以下错误:运算符'??'不能应用于类型 'System.DateTime的' 的操作数

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,为什么出现这种情况,如何解决?

回答

11

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

+0

为什么'r.ServDate'不能'null'?!!我想检查,如果这些是空属性或未设置(填充)值 –

+2

@just_name这就是为什么它不能为空:http://msdn.microsoft.com/en-us/library/vstudio/1t3y8s4s.aspx –

+0

那么如果我没有设置这些属性并插入数据库,这会产生任何错误? –

6

默认情况下,nullcoalescing运算符不能应用于类似于DateTime的内在不可空的类型。如果您仍希望使用它,则必须预见使用DateTime作为可空类型,例如使用例如。 DateTime? dt;

3

你r.ServDate属性需要可空:

public DateTime? ServDate { get; set; } 

日期时间在默认情况下是不可为空

2

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

这是整数一样,双打等

经营者使用的是检查,如果该值为空,所以它是没有必要的。

但是,您可能会考虑检查该值与基准值(如最小值)。你实际上要考虑这个变量的默认值是什么,如果这是可以接受的,然后检查它。

再次考虑一个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].ValueNull之前。第一个问题是你在EndServReward类中设置ServDate属性的默认值是什么?相反,当您创建对象本身时,转换为nullDateTime.Min时应该更好地为ServData设置默认值。这将有助于在一个地方决定功能并提供一致的解决方案。

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

相关问题