如何将DateTime.TryParse与Nullable <DateTime>一起使用?

Bri*_*van 110 c# datetime nullable

我想使用DateTime.TryParse方法将字符串的datetime值变为Nullable.但是,当我尝试这个:

DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);
Run Code Online (Sandbox Code Playgroud)

编译告诉我

'out'参数未被归类为变量

不知道我需要做什么.我也尝试过:

out (DateTime)d.Value 
Run Code Online (Sandbox Code Playgroud)

这也不起作用.有任何想法吗?

Jon*_*eet 155

正如Jason所说,你可以创建一个正确类型的变量并传递它.您可能希望将其封装在您自己的方法中:

public static DateTime? TryParse(string text)
{
    DateTime date;
    if (DateTime.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

...或者如果您喜欢条件运算符:

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}
Run Code Online (Sandbox Code Playgroud)

或者在C#7中:

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;
Run Code Online (Sandbox Code Playgroud)

  • 我可能不应该和The Skeet争论,但是......你应该调用你的方法Parse,因为我希望一个名为TryParse的方法遵循TryParse约定并返回一个布尔值.;-) (5认同)
  • @Kiquenet:使用 else 可以更清楚地表明将采用一条或另一条路径,并且都返回。我反对大量嵌套的代码,但在这种情况下,IMO 真的不是问题。 (3认同)
  • @JeppeStigNielsen:是的,这是不必要的 - 但从风格上来说,它可能更适合对称。这只是个人喜好(而且我也不一致......) (2认同)

Jas*_*ley 120

DateTime? d=null;
DateTime d2;
bool success = DateTime.TryParse("some date text", out d2);
if (success) d=d2;
Run Code Online (Sandbox Code Playgroud)

(可能有更优雅的解决方案,但你为什么不简单地做上面的事情?)

  • 为什么要将DateTime转换为DateTime?在将其传递给TryParse之前,您不需要重新调用d2. (4认同)
  • 你是对的,我正在寻找更多的单线来完成它,但我想这样做.不喜欢创建那个临时变量,感觉很乱.: - /似乎应该更好地支持这种情况. (3认同)

小智 20

这是Jason建议的一个稍微简洁的版本:

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;
Run Code Online (Sandbox Code Playgroud)


Bin*_*ier 19

你不能因为Nullable<DateTime>是不同的类型DateTime.你需要编写自己的函数来做到这一点,

public bool TryParse(string text, out Nullable<DateTime> nDate)
{
    DateTime date;
    bool isParsed = DateTime.TryParse(text, out date);
    if (isParsed)
        nDate = new Nullable<DateTime>(date);
    else
        nDate = new Nullable<DateTime>();
    return isParsed;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)

编辑: 删除(显然)不正确测试的扩展方法,因为(由一些不好的囤积指出)尝试更改"this"参数的扩展方法将无法使用值类型.

PS Bad Hoor有问题是老朋友:)


cpc*_*lla 8

这是您正在寻找的一款内衬:

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;
Run Code Online (Sandbox Code Playgroud)

如果你想让它成为一个合适的 TryParse 伪扩展方法,你可以这样做:

public static bool TryParse(string text, out DateTime? dt)
{
    if (DateTime.TryParse(text, out DateTime date))
    {
        dt = date;
        return true;
    }
    else
    {
        dt = null;
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 忽略我之前的评论(我已经对你的解决方案投了赞成票!),对于最新的 C#,我需要强制转换 null: DateTime? d = DateTime.TryParse(blah, out DateTime dt) ?dt : (日期时间?)null; (2认同)