无法隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换
Posted
技术标签:
【中文标题】无法隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换【英文标题】:Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists 【发布时间】:2013-11-27 04:28:49 【问题描述】:我正在尝试将 DateTime?
转换为 DateTime
但我收到此错误:
错误 7 无法隐式转换类型“System.DateTime?”到 '系统。日期时间'。存在显式转换
这是我的代码:
public string ConvertToPersianToShow(DateTime? datetime)
DateTime dt;
string date;
dt = datetime;
string year = Convert.ToString(persian_date.GetYear(dt));
string month = Convert.ToString(persian_date.GetMonth(dt));
string day = Convert.ToString(persian_date.GetDayOfMonth(dt));
if (month.Length == 1)
month = "0" + Convert.ToString(persian_date.GetMonth(dt));
if (day.Length == 1)
day = "0" + Convert.ToString(persian_date.GetDayOfMonth(dt));
//date = Convert.ToString(persian_date.GetYear(dt)) + "/" +
Convert.ToString(persian_date.GetMonth(dt)) + "/" +
//Convert.ToString(persian_date.GetDayOfMonth(dt));
date = year + "/" + month + "/" + day+"("+dt.Hour+":"+dt.Minute+")";
return date;
【问题讨论】:
这是你的问题:dt = datetime;您应该检查日期时间是否有值(HasValue),然后尝试获取它,或者如果该值不存在,则采取相应的行动。 【参考方案1】:dt
是nullable
你需要访问它的Value
if (datetime.HasValue)
dt = datetime.Value;
重要的是要记住它可以是NULL
。这就是为什么nullable
struct 有HasValue
属性,它告诉你它是否是NULL
。
您也可以使用null-coalescing operator
??
来分配默认值
dt = datetime ?? DateTime.Now;
如果左边的值为NULL
,这将分配右边的值
【讨论】:
我把它改成了这样:DateTime dt=DateTime.Now; @EhsanAkbar 可能将其更改为DateTime dt = datetime??DateTime.Now
?
是的,正如我在回答中提到的那样。这样你就可以保持你的价值,如果有的话【参考方案2】:
您应该使用 datetime 参数的 .Value。 所有 Nullable 结构都有一个 value 属性,它返回对象的具体类型。但是你必须事先检查它是否为空,否则你会得到一个运行时错误。
即:
datetime.Value
但要先检查它是否有值!
if (datetime.HasValue)
// work with datetime.Value
【讨论】:
【参考方案3】:您有 3 个选项:
1) 获取默认值
dt = datetime??DateTime.Now;
如果datetime
为空,它将分配DateTime.Now
(或您想要的任何其他值)
2) 检查日期时间是否包含值,如果不包含则返回空字符串
if(!datetime.HasValue) return "";
dt = datetime.Value;
3) 将方法的签名更改为
public string ConvertToPersianToShow(DateTime datetime)
这都是因为DateTime?
意味着它可以为空DateTime
所以在将它分配给DateTime
之前,您需要检查它是否包含值,然后才分配。
【讨论】:
我不认为 ??在这里工作。左侧的日期时间仍然无法转换。我认为你必须做 datetime.HasValue ? datetime.Value : DateTime.Now @MillieSmith 不,??
是这个意思,确切地说是datetime.HasValue ? datetime.Value : DateTime.Now
它只是那个的简短版本
我知道。我只是不记得编译器弄清楚了(即使它应该能够)。
??
就像一个魅力,但我们使用当前日期作为默认值。我想指定什么,例如 1.1.2000 作为默认日期?
@Cromwell 使用 dt = datetime??new DateTime(2000,1,1);
【参考方案4】:
问题是您将nullable type 传递给不可为空的类型。
您可以执行以下任一解决方案:
A.将您的 dt
声明为可为空
DateTime? dt = dateTime;
B.使用DateTime? datetime
的Value
属性
DateTime dt = datetime.Value;
C.投射它
DateTime dt = (DateTime) datetime;
【讨论】:
以上是关于无法隐式转换类型“System.DateTime?”到“系统。日期时间”。存在显式转换的主要内容,如果未能解决你的问题,请参考以下文章
asp.net 无法将类型“System.DateTime”隐式转换为“string”
无法将类型“System.DateTime”隐式转换为“string”是啥意思?怎么改正?
获取“'<null>' 和 'System.DateTime' 之间没有隐式转换”错误消息 [关闭]
转换器无法在 windows phone 8.1 Datepicker 中将类型“system.datetime”的值转换为类型“datetime”