可以为空的对象必须具有值datetime

时间:2014-07-27 00:35:31

标签: c#

数据库

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
}

错误:Nullable对象必须具有值 问题是什么? 谢谢

2 个答案:

答案 0 :(得分:3)

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进行比较,因为它是一个布尔值,所以它总是为假。

您希望如下所示DisembarkDate

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

答案 1 :(得分:1)

您正在使用条件表达式,但条件错误,整个表达式毫无意义。此外,第三个操作数具有将null分配给您已知的值为null的副作用(代码气味)。

item.cc_EmbarkDate.HasValue的值是布尔值,因此它永远不能为空。这使表达式成立,并且即使没有值,您也总是尝试从可空值中获取值。

你要做的是:

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

DisembarkDate = item.cc_DisembarkDate.HasValue ? item.cc_DisembarkDate.Value : null

但是,如果有值,则获取值,否则返回null是没有意义的,因为这是可空的已经包含的内容。你会这样做:

EmbarkDate = item.cc_EmbarkDate,

DisembarkDate = item.cc_DisembarkDate