【问题标题】:No overload method for ToString takes 2 argumentsToString 没有重载方法需要 2 个参数
【发布时间】:2016-05-16 02:23:15
【问题描述】:

我正在尝试使用 ToString 方法将日期时间格式化为“c”形式的字符串:

string end = evt.End.DateTime.ToString("c", DataController.culture);

DataController.culture 是对有效区域性对象的引用,而 evt 是来自 Google Calendar v3 API 的 Event 对象。我确信 DateTime 属于 DatetTime 类,因为调试器在对象的类型中是这样说的。

但是我不断收到标题中提到的问题,为什么?甚至MSDN docs 也展示了如何使用该方法,但不知何故我不能:

Console.WriteLine(date1.ToString("d MMMM", 
                  CultureInfo.CreateSpecificCulture("es-MX")));
// Displays 29 agosto    

【问题讨论】:

  • 将代码更改为evt.End.DateTime.GetType().FullName。您认为是 DateTime 的类型的全名是什么?
  • 在查看那些是虚拟的文档时,这会让我相信它们在访问时可能实际上是不同的类型developers.google.com/resources/api-libraries/documentation/…
  • 我没有考虑到该类型可能是可空的;傻我。这将解释观察到的行为,而我建议的测试——打印运行时类型——在典型情况下不会表明问题。 (因为如果值为 null,GetType() 会崩溃,如果不是,则返回 typeof(DateTime)。)
  • 但这发生在编译时,是否意味着我必须将其转换为另一种类型或者我该如何处理?
  • 另外,这怎么跑题了? Afaik 我在问一个关于特定语言的特定实现的问题,没有基于意见或类似的东西。我希望这是一个巨魔。

标签: c# .net


【解决方案1】:

API documentation 表示您尝试访问的属性ToString() 实际上是System.Nullable<DateTime>,它与普通DateTime 有不同的可用性考虑。为了调用您希望的 ToString 方法,您需要从提供给您的可为空的结构中检索具体的 DateTime 结构 - 在您的情况下,通过执行以下操作:

string end = evt.End.DateTime.Value.ToString("c", DataController.culture);

请注意,您通常需要在调用 ToString() 或任何其他方法或属性之前先检查 HasValue 属性,以检查您的可空对象(例如 evt.End.DateTime)是否确实具有值。

【讨论】:

  • 不错的收获!我注意到在 C# 6 中,您还可以使用可空成员访问运算符优雅地解决问题。
  • 我实际上尝试过(对 Nullable 对象一无所知)并且因为 IDE 建议将 Value 作为属性,但是在这些行中出现“不允许操作”错误或其他内容,是因为对象在运行时为空?我必须先安全检查一些东西吗?同样,我是 C# 新手。
  • 一般来说,如果对象确实为空,则会抛出NullReferenceException。您能否使用引发您描述的错误的代码更新您的问题?
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2016-11-15
相关资源
最近更新 更多