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

时间:2008-10-10 16:21:14

标签: c# datetime nullable

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

DateTime? d;
bool success = DateTime.TryParse("some date text", out (DateTime)d);

编译器告诉我

  

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

不确定我需要在这做什么。我也试过了:

out (DateTime)d.Value 

这也不起作用。有什么想法吗?

9 个答案:

答案 0 :(得分:148)

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

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

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

public static DateTime? TryParse(string text)
{
    DateTime date;
    return DateTime.TryParse(text, out date) ? date : (DateTime?) null;
}

或者在C#7中:

public static DateTime? TryParse(string text) =>
    DateTime.TryParse(text, out var date) ? date : (DateTime?) null;

答案 1 :(得分:115)

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

(可能会有更优雅的解决方案,但为什么不简单地按上述方式执行操作?)

答案 2 :(得分: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;
}

希望这会有所帮助:)

修改 删除了(显然)不正确测试的扩展方法,因为(如某些坏的指示),尝试更改“this”参数的扩展方法不适用于值类型。

P.S。有问题的Bad Hoor是一位老朋友:)

答案 3 :(得分:19)

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

DateTime? d; DateTime dt;
d = DateTime.TryParse(DateTime.Now.ToString(), out dt)? dt : (DateTime?)null;

答案 4 :(得分:4)

如何创建扩展方法?

public static class NullableExtensions
{
    public static bool TryParse(this DateTime? dateTime, string dateString, out DateTime? result)
    {
        DateTime tempDate;
        if(! DateTime.TryParse(dateString,out tempDate))
        {
            result = null;
            return false;
        }

        result = tempDate;
        return true;

    }
}

答案 5 :(得分:1)

我不明白微软为什么不处理这个问题。一个聪明的小实用工具方法来解决这个问题(我遇到了int的问题,但用DateTime替换int会产生同样的效果,可能是......

    public static bool NullableValueTryParse(string text, out int? nInt)
    {
        int value;
        if (int.TryParse(text, out value))
        {
            nInt = value;
            return true;
        }
        else
        {
            nInt = null;
            return false;
        }
    }

答案 6 :(得分:1)

这是您正在寻找的班轮:

DateTime? d = DateTime.TryParse("some date text", out DateTime dt) ? dt : null;

如果要使其成为适当的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;
    }
}

答案 7 :(得分:1)

这是单行解决方案:

DateTime? d = DateTime.TryParse("text", out DateTime parseDate) ? parseDate : (DateTime?)null;

答案 8 :(得分:-1)

或者,如果您不担心可能引发的异常,则可以将TryParse更改为Parse:

DateTime? d = DateTime.Parse("some valid text");

尽管也不会表示成功的布尔值,但是在某些情况下,当您知道输入文本将始终有效时,这可能是可行的。