0

在尝试处理无效或空日期输入时,我遇到了 Nullable 日期的挑战

对于普通DateTime变量,我可以这样做

DateTime d = new DateTime.Now; //You can also use DateTime.MinValue. You cannot assign null here, WHY? 
DateTime.TryParse(ctrlDate.Text, out d);

对于可为空的日期时间

DateTime? nd = null;
DateTime.TryParse(ctrlDate.Text, out nd); //this doesn't work. it expects DateTime not DateTime?

对于日期时间?

System.DateTime.TryParse(string, out System.DateTime) 的最佳重载方法匹配有一些无效参数

所以我不得不把它改成

DateTime? nd = null;
DateTime d = DateTime.Now;
if(DateTime.TryParse(ctrlDate.Text, out d))
   nd = d;

我必须为可空日期创建一个额外的DateTime变量来实现这一点。

有没有更好的办法?

4

4 回答 4

4

您不需要为作为out参数传递给方法的变量分配任何内容,只需:

DateTime d;
if (DateTime.TryParse(ctrlDate.Text, out d))
{
    // the date was successfully parsed => use it here
}
else
{
    // tell the user to enter a valid date
}

至于您为什么不能写的第一个问题DateTime d = null;,那是因为 DateTime 是值类型,而不是引用类型。

于 2012-09-20T07:19:56.097 回答
2

日期时间 d = 新的日期时间。现在;//这里不能赋值null,为什么?

因为它是一个值类型,它是一个结构,所以您不能将 null 分配给结构/值类型。

对于 DateTime.TryParse

如果要使用,DateTime.TryParse则必须创建一个额外的类型变量,DateTime然后根据需要将其值分配给 Nullable DateTime。

于 2012-09-20T07:19:28.013 回答
2

您确实需要创建额外的DateTime变量,没有更好的方法。

虽然您当然可以将其封装在您自己的解析方法中:

bool MyDateTimeTryParse(string text, out DateTime? result)
{
    result = null;

    // We allow an empty string for null (could also use IsNullOrWhitespace)
    if (String.IsNullOrEmpty(text)) return true;

    DateTime d;
    if (!DateTime.TryParse(text, out d)) return false;
    result = d;
    return true;
}
于 2012-09-20T07:35:19.123 回答
0

为什么不使用

DateTime.MinValue 

而不是可为空的类型?

于 2012-09-20T07:22:38.233 回答