我只是想了解为什么会抛出此异常。
无法隐式转换类型'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小时但是试图理解异常,有人会给我一个解释。
答案 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