可为null的对象必须具有值datetime

本文关键字:datetime null 对象 可为 | 更新日期: 2023-09-27 18:15:08

数据库

EmbarkDate       [] allowNulls checked
DisembarkDate    [] allowNulls checked
  update [dbo].[t_CrewContract] set EmbarkDate= null where cc_ID='AEDAEC31-6108-CE8F-97DF-114FD87A6257'
  update [dbo].[t_CrewContract] set DisembarkDate= null where cc_ID='AEDAEC31-6108-CE8F-97DF-114FD87A6257' 

c#

     public DateTime? EmbarkDate { get; set; }
     public DateTime? DisembarkDate{ get; set; }
ContractItems.Add(new ContractItem
                    {
   EmbarkDate = item.cc_EmbarkDate.HasValue != null ? item.cc_EmbarkDate.Value : item.cc_EmbarkDate = null,
   DisembarkDate = item.cc_DisembarkDate.HasValue != null ? item.cc_DisembarkDate.Value     : item.cc_DisembarkDate = null,
});
if(activeContract.EmbarkDate == null)
{
  //...codes
}

错误:可为null的对象必须有一个值有什么问题感谢

可为null的对象必须具有值datetime

EmbarkDate = item.cc_EmbarkDate.HasValue != null 
    ? item.cc_EmbarkDate.Value : item.cc_EmbarkDate = null,
DisembarkDate = item.cc_DisembarkDate.HasValue != null
    ? item.cc_DisembarkDate.Value : item.cc_DisembarkDate = null

这里的问题是,您正在将HasValue与null进行比较,因为它是布尔值,所以它将始终为false。

您只想拥有如下和相同的DisembarkDate

EmbarkDate = item.cc_EmbarkDate.HasValue ? (DateTime?)item.cc_EmbarkDate.Value : item.cc_EmbarkDate = null

您使用的是一个条件表达式,但条件是错误的,整个表达式毫无意义。此外,第三个操作数还有一个副作用(代码气味(,就是将null赋值给一个已知为null的值。

item.cc_EmbarkDate.HasValue的值是布尔值,因此它永远不能为null。这使得表达式为true,并且您将始终尝试从nullable中获取值,即使没有值。

你要做的是:

EmbarkDate = item.cc_EmbarkDate.HasValue ? item.cc_EmbarkDate.Value : null,
DisembarkDate = item.cc_DisembarkDate.HasValue ? item.cc_DisembarkDate.Value : null

然而,如果有一个值,则获取该值,否则获取null是毫无意义的,因为nullable已经包含了这个值。你只需要做:

EmbarkDate = item.cc_EmbarkDate,
DisembarkDate = item.cc_DisembarkDate