【问题标题】:Why does ToString() not always work on DateTime objects?为什么 ToString() 并不总是适用于 DateTime 对象?
【发布时间】:2014-10-01 19:12:20
【问题描述】:

有时,在 Razor 视图中,我正在做类似以下的事情:

@Model.SomeDate1.ToString("MM/dd/yyyy")

这有时有效,有时它会给我一个错误,关于 ToString 没有重载需要 1 个参数。我找到的答案与这里找到的类似: 'No overload for method 'ToString' takes '1' arguments' error occur While Formatting Datetime Field To String ON "dd-MM-yyyy" format

我知道什么时候出现这个错误,我可以随时修改我的语句为

@Model.SomeDate2.Value.ToString("MM/dd/yyyy")

它会起作用的。我的问题是,为什么在这种情况下会发生这种情况?这些属性同时在同一对象上以相同类型(不可为空的 DateTime)通过,从同一数据库中的同一表填充。只有一个在.ToString() 之前需要.Value,而另一个不需要。这是为什么呢?

【问题讨论】:

  • SomeDate1的类型是什么?不是DateTime?吗?
  • 确定其中一个属性Nullable<DateTime> (DateTime?)。只有这样你才会得到错误。
  • DateTime 没有 Value 属性。您的财产是DateTime?
  • 你确定它们是同一类型吗? .Value 仅适用于可为空的 DateTime?
  • Habib(编辑:和其他所有人),你是对的。实际上,在 .ToString() 之前需要 .Value 的那个是可为空的 DateTime。不可为空的 DateTime 无需先使用 .Value 即可访问 ToString。显然我只是选择性地对问号视而不见。 Habib,如果您将其作为答案发布,我将很乐意接受。

标签: c# asp.net-mvc razor


【解决方案1】:

确定其中一个属性 是 Nullable(日期时间?)。只有这样你才会得到错误。

Nullable<DateTime>DateTime? 没有采用格式参数的 ToString 重载。您应该检查您的 Nullable<DateTime> 是否具有以下值:

if(SomeDate2.HasValue)
{
  return SomeDate2.Value.ToString("MM/dd/yyyy");
}

如果您不确定您的财产是否是Nullable<T>,那么您可以查看this post 来确定。

在使用ToString 时还要考虑使用CultureInfo.InvariantCulture,否则您的输出字符串中的分隔符可能与/ 不同。

  return SomeDate2.Value.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture);

【讨论】:

  • Habib,即使您检查 HasValue 是否可以为空,如果您尝试使用 ToString("MM/dd/yyyy") 仍然会抛出异常,纯粹是因为如果没有 Value ToString 则需要 Value () 不接受格式:-)
  • @AlexanderMarinov,谢谢,我错过了代码中的Value,实际上它不会抛出异常,而是会出现编译时错误
【解决方案2】:

好吧,您的 SomeDate2 是可空的,如果您在可空上执行 ToString(),则格式字符串是不允许的。 SomeDate1 是一个正常的 DateTime,因此它可以工作,对于 SomeDate2,您需要使用 SomeDate2.Value。但不要忘记检查 HasValue :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2012-07-17
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多