无法隐式转换类型'System.DateTime?'到'System.DateTime'。存在显式转换

时间:2013-11-14 08:36:43

标签: c# linq

我想转换日期时间? todatetime但是我得到了这个错误:

  

错误7无法隐式转换类型'System.DateTime?'至   '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 个答案:

答案 0 :(得分:40)

您有3个选项:

1)获取默认值

dt = datetime??DateTime.Now;

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

2)检查datetime是否包含值,如果不是则返回空字符串

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

3)将方法的签名更改为

public string ConvertToPersianToShow(DateTime  datetime)

全部是因为DateTime?意味着它可以为DateTime,所以在将其分配给DateTime之前,您需要检查它是否包含值,然后再分配。

答案 1 :(得分:19)

dt nullable您需要访问其Value

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

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

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

dt = datetime ?? DateTime.Now;

如果左侧的值为NULL

,则会在右侧指定值

答案 2 :(得分:2)

问题是您将nullable type传递给非可空类型。

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

一个。将您的dt声明为可以为空的

DateTime? dt = dateTime;

B中。使用Value

DateTime? datetime属性

DateTime dt = datetime.Value;

℃。施展它

DateTime dt = (DateTime) datetime;

答案 3 :(得分:1)

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

即:

datetime.Value

但请先查看它是否有值!

if (datetime.HasValue)
{
   // work with datetime.Value
}