C#转换为日期 - 在System.DateTime&#39;之间没有隐式转换。和&#39; <null>&#39; </null>

时间:2014-06-02 14:47:06

标签: c#

我有以下代码:

      var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
      DateAnalyzed_Copper = records.DateAnalyzed_Copper.HasValue ? TimeZoneInfo.ConvertTimeToUtc(records.DateAnalyzed_Copper.Value, tz) : null,

...

请注意,DateAnalyzed_Copper是可以为空的DateTime。

我收到以下消息

Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DateTime' and '<null>'   

2 个答案:

答案 0 :(得分:1)

您应该将null强制转换为可以为空的DateTime:

DateAnalyzed_Copper = records.DateAnalyzed_Copper.HasValue ? 
   TimeZoneInfo.ConvertTimeToUtc(records.DateAnalyzed_Copper.Value, tz)  
   : (DateTime?)null

DateTime返回的ConvertTimeToUtc值:

DateAnalyzed_Copper = records.DateAnalyzed_Copper.HasValue ? 
  (DateTime?)TimeZoneInfo.ConvertTimeToUtc(records.DateAnalyzed_Copper.Value, tz)
  : null

三元运算符在两个分支上都需要相同的类型,或者它们之间应该存在隐式转换。您有不同的类型,DateTimenull之间没有隐式转换。所以,你应该使用明确的一个。

答案 1 :(得分:0)

错误表明null的显式值不是有效的DateTime值;您可以通过以下方式将null转换为DateTime

(DateTime?)null

或使用C#的default()

default(DateTime)

示例:

DateAnalyzed_Copper = records.DateAnalyzed_Copper.HasValue ? 
    TimeZoneInfo.ConvertTimeToUtc(records.DateAnalyzed_Copper.Value, tz) : 
    default(DateTime);

或者,虽然我不是这种方法的粉丝,但您可以在首次创建时将DateAnalyzedCopper变量声明为可空:

DateTime? DateAnalyzedCopper;