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

52

我正试图将 DateTime? 转换为 DateTime,但是遇到了以下错误:

Error 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;
}

这是你的问题:dt = datetime; 你应该检查datetime是否有值(HasValue),然后尝试获取它,或者根据情况采取相应措施。 - Piotr Justyna
4个回答

67

您有3个选项:

1)获取默认值

dt = datetime??DateTime.Now;

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

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

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

3)将方法签名更改为

public string ConvertToPersianToShow(DateTime  datetime)

这是因为 DateTime? 表示它是可空的 DateTime,所以在将其赋给 DateTime 之前,需要检查它是否包含值,只有在包含值的情况下才能进行赋值。


我认为这里不适用 ??. 左边的时间仍然无法转换。我认为你需要进行 datetime.HasValue ? datetime.Value : DateTime.Now 的操作。 - Millie Smith
@MillieSmith 不是的,?? 的意思就是它,完全等同于 datetime.HasValue ? datetime.Value : DateTime.Now,只是它的简写版本。 - Kamil Budziewski
我知道。只是我不记得编译器是如何解决这个问题的(尽管它应该能够解决)。 - Millie Smith
“??” 的效果非常好,但我们正在使用当前日期作为默认值。如果我想将默认日期指定为例如 2000 年 1 月 1 日,该怎么办? - Cromwell
1
@Cromwell 使用 dt = datetime??new DateTime(2000,1,1); - Kamil Budziewski

30

dtnullable 的,你需要访问它的 Value

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

记住它可能为NULL,这就是为什么nullable结构有HasValue属性来告诉你它是否为NULL

你也可以使用null-coalescing operator??来分配一个默认值。

dt = datetime ?? DateTime.Now;

如果左侧的值为 NULL,则将右侧的值分配给它。


我将它改成了类似这样的形式:DateTime dt = DateTime.Now; - user2796487
@EhsanAkbar 或许改为 DateTime dt = datetime??DateTime.Now - Kamil Budziewski
是的,正如我在我的回答中提到的那样。这样,如果有价值,您就可以保留它。 - David Pilkington

6
问题是你正在将一个 可空类型 传递给非可空类型。
你可以采取以下任何一种解决方案:
A. 将你的 dt 声明为可空类型 DateTime? dt = dateTime; B. 使用 DateTime? datetimeValue 属性 DateTime dt = datetime.Value; C. 进行强制类型转换 DateTime dt = (DateTime) datetime;

3

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

例如:

datetime.Value

但是首先要检查它是否有值!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接