【问题标题】:TryParse to a nullable typeTryParse 为可空类型
【发布时间】:2011-12-01 23:04:18
【问题描述】:

我想尝试将string 解析为DateTime?,如果失败则将值设置为null。我能想到的唯一方法是以下,但它似乎不是很整洁。

DateTime temp;
DateTime? whatIActuallyWant = null;
if (DateTime.TryParse(txtDate.Text, out temp)) whatIActuallyWant = temp;

这是唯一的方法吗?

【问题讨论】:

标签: c# .net null nullable tryparse


【解决方案1】:

这个怎么样:

DateTime? whatIActuallyWant = DateTime.TryParse(txtDate.Text, out temp) ? (DateTime?)temp : null;

您从中得到了一个单行符(不幸的是需要DateTime? 强制转换,否则将无法编译) - 但我个人可能会坚持使用null 初始化和随后的if - 它更容易阅读。

【讨论】:

  • 我之前试过这个,但是它返回错误:无法确定条件表达式的类型,因为'System.DateTime'和''之间没有隐式转换。
  • @James:请参阅DateTime? 的演员表 - 不幸的是,这是必要的,因为这两个术语必须是隐式可转换的 - 替代方案是 ? temp : (DateTime?)null;
  • @James,让我们看看这个。您仍然必须声明 temp 变量,因此添加该行。因此,我们将您的 3 行代码缩减为 2 行。这个版本或多或少具有可读性?我们必须滚动才能看到这一切。或多或少复杂?我们已经介绍了一个演员表。如果你问我,一只手拿着半打,另一只手拿着 6 个。
  • 我刚刚在想 - DateTime? whatIActuallyWant = null; try { whatIActuallyWant = Convert.ToDateTime(txtDate.Text); } catch { } 怎么样
  • @James:我不会走那条路——如果你预计你的解析可能会失败,请使用TryParse——无论如何,抛出的异常在运行时是非常昂贵的,我会尽量避免这种情况。
【解决方案2】:

如果您要多次执行此操作,那么我建议添加一个简单的扩展方法以方便使用...

public static class Extensions
{
    public static DateTime? ToDateTime(this string val)
    {
        DateTime temp;
        if (DateTime.TryParse(val, out temp))
            return temp;
        else 
            return null;
    }
}

你可以很容易地使用它......

DateTime? ret1 = "01/01/2011".ToDateTime();
DateTime? ret2 = myString.ToDateTime();

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2010-10-10
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多