DateTime.TryParse不接受可空的DateTime?

6

我有一个可空变量:

private DateTime? _startDate;

我想把一些变量解析为日期时间,然后将其赋值给该变量,但是VS会抱怨TryParse方法有一些无效的参数。

if (string.IsNullOrEmpty(Request.Form["StartDate"]) == false)
        {
            DateTime.TryParse(Request.Form["StartDate"], out _startDate);
        }
        else
        { _startDate = null; }

这里是否存在语法错误,或者我不能在这里使用可空变量?
4个回答

11

不可以,DateTime.TryParse() 不接受 DateTime?,因为 DateTime? 实际上是 Nullable<DateTime> 类型,而不是兼容的类型。

尝试使用以下代码:

if (string.IsNullOrEmpty(Request.Form["StartDate"]) == false)
    {
        var dtValue = new DateTime();
        if (DateTime.TryParse(Request.Form["StartDate"], out dtValue)) {
            _startDate = dtValue;
        }
        else {
            _startDate = null;
        }
    }
    else
    { _startDate = null; }

2
请注意,实际上并不需要对null或空值进行检查 - DateTime.TryParse方法会为您执行此操作,这可能会简化此代码块。 - Reed Copsey
@ReedCopsey 是的,说得好。当前检查 IsNullOrEmpty(...) 后只需要条件语句中的 true 部分。 - Yuck
1
你不需要初始化dtValue,因为它用作out参数。 - Jon Skeet
@JonSkeet 我知道。这是强迫症的问题。看到变量没有明确初始化就让我很难受。我为此参加了小组会议。 - Yuck
@ReedCopsey:说实话,我不确定。个人而言,我只是不喜欢在我的代码中看到永远不会被使用的值。 - Jon Skeet
显示剩余2条评论

11

就像其他人所说的那样,它们不是兼容类型。我建议您创建一个新方法来包装 DateTime.TryParse 并且返回 一个 Nullable<DateTime>

// Add appropriate overloads to match TryParse and TryParseExact
public static DateTime? TryParseNullableDateTime(string text)
{
    DateTime value;
    return DateTime.TryParse(text, out value) ? value : (DateTime?) null;
}

那么你可以直接使用:

_startDate = Helpers.TryParseNullableDateTime(Request.Form["StartDate"]);

(不需要检查 null 或空字符串;TryParse 会在这种情况下返回 false。)


我希望在 Nullable<T> 类中添加一些内容。 - Yuck
@Yuck:我喜欢“TryParseSomeType”和“TryParseNullableSomeType”两者,这取决于上下文。然而,我觉得提供两个函数会污染成员列表,并且我在这两者之间没有强烈的偏好。 - Brian

0
这是代码。异常已被处理。
if (string.IsNullOrEmpty(Request.Form["StartDate"]) == false)
        {
            DateTime strtDate;
            try
              {
                strtDate = Convert.ToDateTime(Request.Form["StartDate"]);
                _startDate = strtDate;
              }
            catch(Exception)
              {
               _startDate = null;
              }
         }
        else
        { 
       _startDate = null;
        }

0

DateTime?DateTime 是与 out 不兼容的不同类型。因此,您需要使用 DateTime,然后按照 Yuck 的答案复制值。


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