为什么它抛出异常,如果它的类型日期时间相同

时间:2012-03-29 23:38:44

标签: c#

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

无法隐式转换类型'System.DateTime?'到'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小时但是试图理解异常,有人会给我一个解释。

6 个答案:

答案 0 :(得分:4)

DateTime testconverttime = story.BroadcastOn.Value;

它是可以为空的类型(也可以是null状态)

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

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

答案 1 :(得分:3)

尝试此操作,假设可空类型具有值:

DateTime testconverttime = story.BroadcastOn.Value;

答案 2 :(得分:3)

DateTime?DateTime 不是相同的类型。 DateTime?DateTime类型的nullable version

你应该检查它是否为null,然后转换或检索可空的值:

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并转换为非可空类型应该是等效的。您也可以使用??运算符。

答案 3 :(得分:2)

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

DateTime testconverttime = (DateTime)story.BroadcastOn

答案 4 :(得分:1)

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

答案 5 :(得分:1)

DateTime?DateTime的类型不同,因此您无法隐式地将DateTime?分配给DateTime

您需要显式转换它或通过Value的{​​{1}}属性分配值。但是,如果DateTime为null,则任何一种方法都会抛出异常。

如果您不知道BroadcastOn不为null,那么您最好选择使用null-coalescing运算符:

BroadcastOn