2017-10-17 109 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)。