为什么ToString()不总是在DateTime对象上工作?

时间:2014-10-01 19:12:20

标签: c# asp.net-mvc razor

有时候,在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),从同一数据库中的同一个表填充。只有一个在.Value之前需要.ToString()而另一个不需要{{1}}。这是为什么?

2 个答案:

答案 0 :(得分:3)

你的SomeDate2是可以为空的,如果你对可以为空的ToString()不允许使用格式字符串。 SomeDate1是正常的DateTime,因此它可以工作,对于SomeDate2,您需要使用SomeDate2.Value。但是别忘了检查HasValue: - )

答案 1 :(得分:3)

对于确定其中一个属性是Nullable(DateTime?)。只有这样你才会收到错误。

Nullable<DateTime>DateTime?没有ToString重载,它带有格式参数。您应该检查Nullable<DateTime>是否有某些值,如:

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

如果您不确定自己的财产,无论是Nullable<T>还是CultureInfo.InvariantCulture,您都可以看到this post来确定。

在使用ToString时也请考虑使用/,否则您最终可能会在输出字符串中使用与 return SomeDate2.Value.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); 不同的分隔符。

{{1}}