无法隐式转换类型“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】:

dtnullable 你需要访问它的Value

if (datetime.HasValue)
    dt = datetime.Value;

重要的是要记住它可以是NULL。这就是为什么nullablestruct 有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? datetimeValue属性

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”

提示:无法将类型为“System.DateTime”的对象强制转换为类型“System.String”。

无法将类型为“System.DateTime”的对象强制转换为类型“System.String”