2017-10-17 106 views
1

我正在做一個對象到DateTime的簡單轉換。該對象也是一個DateTime。但是,取消裝箱的值與對象不同。爲什麼DateTime不能正確拆箱?

我甚至試過System.Convert.ToDateTime(value)但這沒有什麼區別。

這裏發生了什麼,我失蹤了。

private object Convert(object value, DateTimeConversionTypes dateTimeConversionTypes) 
{ 
    switch (dateTimeConversionTypes) 
    { 
     case DateTimeConversionTypes.ToLocal: 
     { 
      if (!(value is DateTimeOffset)) return null; 
      var dtValue = (DateTimeOffset)value; 
      if (dtValue == DateTimeOffset.MinValue) return null; 
      var returnValue = dtValue.ToLocalTime().DateTime; 
      returnValue = DateTime.SpecifyKind(returnValue, DateTimeKind.Local); 
      return returnValue; 
     } 
     case DateTimeConversionTypes.ToUtc: 
     { 
      if (!(value is DateTime)) return null; 
      var dtValue = (DateTime)value; 
      if (dtValue == DateTime.MinValue) return null; 
      var returnValue = dtValue.ToUniversalTime(); 
      returnValue = DateTime.SpecifyKind(returnValue, DateTimeKind.Utc); 
      return new DateTimeOffset(returnValue); 
     } 
     default: 
      throw new ArgumentOutOfRangeException(nameof(dateTimeConversionTypes), dateTimeConversionTypes, null); 
    } 
} 

enter image description here

+1

在這兩種情況下你應該使用DateTimeOffset嗎? – mayu

+0

@mayu:我不能,這是一個WPF轉換器,在ViewModel'DateTimeOffset'和UI控件'DateTime'之間轉換。 –

+0

我不知道它是什麼,但奇怪的是dtValue的偏移量爲+00:00,而且值沒有偏移字符串。在你的調試窗口中'dtValue'是一個'DateTimeOffset'。你有沒有做任何調試拖動? – mayu

回答

-1

我想我已經找到了答案,需要社區來確認。

這是由於在開關情況下使用相同的變量名稱。儘管有括號並有固定的範圍,但仍然以某種方式(不知道爲什麼)將兩個可變參數視爲相同。當我將變量名稱更改爲唯一的名稱時,它開始執行所需的行爲。

+1

證明這一說法。這聽起來不對。你能不能展示兩個代碼 - 一個有問題,一個沒有 - 這樣我們可以看到它按照你描述的方式工作。我們應該能夠複製,粘貼和運行它。 – Enigmativity

+0

@Enigmativity:你如何解釋'dtValue'具有'偏移量',即使它'DateTime'。 –

+0

我很感興趣看到證明這種情況的代碼。你說「仍然不知何故(不知道爲什麼)」 - 直到你能證明爲什麼這不是答案。 – Enigmativity

0

我不知道怎麼回事,但我猜dtValue被作爲 '的DateTimeOffset' 創建(這就是爲什麼它的文本表示有+00:00)。