我收到以下错误:
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
,为什么会发生这种情况,以及如何修复它?
答案 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
属性的默认值是什么?而是在转换为null
或DateTime.Min
时,更好地在创建对象本身时为ServData
设置默认值。这将有助于在一个地方确定功能并提供一致的解决方案。
您可以在创建时将其选为DateTime.Min
或Null
,而不是将其更新为数据库。