【问题标题】:why it throws an exception,if its same type date time为什么它抛出异常,如果它的类型相同的日期时间
【发布时间】:2012-03-31 04:07:54
【问题描述】:

我只是想了解为什么会抛出这个异常。

不能隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换(您是否缺少演员表?)

这就是我想做的事情

story.BroadcastOn 是从数据库获取的日期时间值(例如:23/03/2012 1:56 Pm)。

我正在尝试将时间从 12 小时格式转换为 24 小时格式,这就是我想要做的

   DateTime testconverttime = story.BroadcastOn;`//this is where it throws exception

所以我必须像下面那样使用解析来解决我的问题,但这对我来说没有意义

     if (!string.IsNullOrEmpty(story.BroadcastOn.ToString()))
            {
                 DateTime localTime = story.BroadcastOn.Value;//Thanks all for the great suggestion.
                converttime = localTime.ToString("dd/MMM/yyyy HH:mm ", CultureInfo.CurrentCulture);
            }

我已经将我的 12 小时转换为 24 小时,但试图理解异常,请有人给我一个解释。

【问题讨论】:

    标签: c#


    【解决方案1】:
    DateTime testconverttime = story.BroadcastOn.Value;
    

    它是一个可空类型(也可以有空状态)

    一个可以为空的值类型(DateTime是一个值类型),有空值(无值)的概念。因此,如果例如数据库中的日期时间列有空值,那么您可以使用 Nullable<DateTime> 或简称 DateTime?存储来自该列的值。

    关于DateTime.ToString()String.ToDateTime():这叫做yo-yo编程。您可能在 Debuger 中看到有一个有效的DateTime 表示,它是通过调用ToString() 给出的,但是,以后不要尝试通过此方法将一个类型转换为另一种类型yo-yo technique.

    【讨论】:

    • ,这是一个很好的解释。非常感谢
    【解决方案2】:

    试试这个,假设可空类型有一个值:

    DateTime testconverttime = story.BroadcastOn.Value;
    

    【讨论】:

    • 感谢 ongle,实际上我正在尝试像 story.BroadcastOn.ToString(dd/MMM/yyyy HH:mm", CultureInfo.CurrentCulture),这假设是转换而不是再次转换日期时间到日期时间然后转换字符串来做这一切的一行代码
    【解决方案3】:

    DateTime?DateTime同一类型。 DateTime?DateTime 类型的 nullable version

    您应该检查它是否为 null,然后强制转换或检索 nullable 的值:

    if (story.BroadcastOn.HasValue) {
        var broadcastOn = story.BroadcastOn.Value;
        // do stuff with broadcastOn
    } else {
        // handle null BroadcastOn
    }
    

    if (story.BroadcastOn != null) {
        var broadcastOn = (DateTime) story.BroadcastOn;
        // do stuff with broadcastOn
    } else {
        // handle null BroadcastOn
    }
    

    使用.HasValue 或与null 比较,使用.Value 并强制转换为不可为空的类型应该是等效的。您还可以使用?? 运算符。

    【讨论】:

    • 在我的代码中做类似的事情,比如 if (!string.IsNullOrEmpty(story.BroadcastOn.ToString())) { DateTime localTime = DateTime.Parse(story.BroadcastOn.ToString()); converttime = localTime.ToString("dd/MMM/yyyy HH:mm", CultureInfo.CurrentCulture); }
    【解决方案4】:

    尝试将其转换为DateTime,如下所示:

    DateTime testconverttime = (DateTime)story.BroadcastOn
    

    【讨论】:

      【解决方案5】:

      System.DateTime?System.DateTime 是两种不同的类型。如果您确定它不为空,则需要使用 story.BroadcastOn.Value。

      【讨论】:

      • 感谢大家的精彩解释,我从来不知道那是两种不同的类型并且也有 null 状态。非常感谢给我启发
      【解决方案6】:

      DateTime?DateTime 不是同一类型,因此您不能将DateTime? 隐式分配给DateTime

      您需要显式转换它或通过DateTimeValue 属性分配值。但是,如果BroadcastOn 为空,则任一方法都会抛出异常。

      如果您不知道 BroadcastOn 不为空,那么您最好的选择是使用空合并运算符:

      DateTime dt = story.BroadcastOn ?? default(DateTime); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多