DateTime.TryParse不接受可为空的DateTime?

Vic*_*tor 6 c# datetime

所以我创建了这个可以为空的变量:

private DateTime? _startDate;
Run Code Online (Sandbox Code Playgroud)

我想将一些变量解析为DateTime,然后将其分配给此变量,但VS抱怨该TryParse方法有一些无效的参数.

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

我有语法错误或者我不能在这里使用可空变量吗?

Jon*_*eet 12

正如其他人所说,他们不是兼容的类型.我建议你创建一个包装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;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

_startDate = Helpers.TryParseNullableDateTime(Request.Form["StartDate"]);
Run Code Online (Sandbox Code Playgroud)

(无需检查null或空字符串; TryParse无论如何都会返回false.)


Yuc*_*uck 10

不,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; }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,确实不需要null或空检查 - DateTime.TryParse将为您执行此操作,这可以简化此块. (2认同)