46

我正在尝试转换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;
}
4

4 回答 4

60

您有 3 个选项:

1) 获取默认值

dt = datetime??DateTime.Now;

如果为空,它将分配DateTime.Now(或您想要的任何其他值)datetime

2)检查日期时间是否包含值,如果不返回空字符串

if(!datetime.HasValue) return "";
dt = datetime.Value;

3)将方法的签名更改为

public string ConvertToPersianToShow(DateTime  datetime)

这一切都是因为DateTime?意味着它可以为空DateTime,因此在将其分配给DateTime您之前需要检查它是否包含值,然后才分配。

于 2013-11-14T08:38:46.563 回答
27

dtnullable你需要访问它吗Value

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

重要的是要记住它可以NULL。这就是为什么nullable结构具有HasValue告诉您它是否存在的属性的原因NULL

您还可以使用分配默认值null-coalescing operator ??

dt = datetime ?? DateTime.Now;

如果左边的值是,这将分配右边的值NULL

于 2013-11-14T08:38:00.410 回答
6

问题是您将可空类型传递给不可空类型。

您可以执行以下任何解决方案:

A. 声明你的可以dt为空

DateTime? dt = dateTime;

B. 使用Value属性DateTime? datetime

DateTime dt = datetime.Value;

C. 铸造它

DateTime dt = (DateTime) datetime;

于 2016-04-20T07:35:29.250 回答
3

您应该使用 datetime 参数的 .Value 。所有 Nullable 结构都有一个 value 属性,它返回对象的具体类型。但是您必须事先检查它是否为空,否则您将收到运行时错误。

IE:

datetime.Value

但先检查它是否有值!

if (datetime.HasValue)
{
   // work with datetime.Value
}
于 2013-11-14T08:38:25.433 回答