【问题标题】:Why is there a Convert.ToInt32(DateTime) method when the operation is "not supported"? [closed]为什么“不支持”操作时会有 Convert.ToInt32(DateTime) 方法? [关闭]
【发布时间】:2014-10-14 08:59:55
【问题描述】:

Convert.ToInt32(DateTime) 方法被记录为始终抛出 InvalidCastException,因为“不支持此转换。”

如果它不受支持,为什么它甚至存在?没有那个功能不是更有意义吗?

【问题讨论】:

  • 这个问题无法真正回答(除非 BCL 团队的成员愿意启发我们所有人)。否则,这实际上只是关于 API 设计的意见。
  • FWIW,DateTime 是 IConvertible 并且有 IConvertible.ToInt32。我想这就是问题的“根源”来自哪里。这实际上使它更加一致,这样Converter.ToInt32((object)dt)(对象被视为 IConvertible)将产生相同的异常。
  • ILSpy 显示:public static int ToInt32(DateTime value) { return ((IConvertible)value).ToInt32(null); }
  • DateTime 实现的所有IConvertible 方法似乎都抛出了异常(ToDateTime 方法除外)。至少Int32Int64IConvertible 实现似乎也为IConvertible.ToDateTime 抛出异常。所以一个相关的问题可能是“为什么 DateTime 实现 IConvertible,什么时候它不会转换成任何东西,什么都不会转换成它?”
  • @pmcoltrane string 将转换为 DateTime 反之亦然,所以不是“无”;-)

标签: c# datetime converter


【解决方案1】:

查看Convert 实现,您可以看到它依赖于由正在转换的类型实现的IConvertible 接口。 IConvertible 接口强制类型实现 all 转换方法,它旨在按照您的描述工作:

如果没有对公共语言运行时类型进行有意义的转换,则特定接口方法实现会抛出InvalidCastException

所以有问题的方法存在于Convert 类中可能因为所有IConvertibles 都必须有这个方法:

public static int ToInt32(DateTime value)
{
    return ((IConvertible)value).ToInt32(null);
}

因此,与其他人注意到的类似,这似乎是与IConvertible 接口和完整性的一致性问题。甚至可能会生成 Convert 的实现,因为它只依赖于 IConvertible

【讨论】:

  • 同意这一点——由于 IConvertible 的一致性。 MSDN 还指出,某些转换会失败,具体取决于输入的大小(即大的双倍到单倍) - 允许异常意味着它们不必进行大量的边界检查等。
【解决方案2】:

我之前对代码生成的预感是错误的。实际上比这简单得多:DateTime 中的几乎所有IConvertible 接口的实现都会抛出InvalidCastException。当您调用 Convert.ToXXX() 时,始终会调用这些调用,如下所示:

Convert.ToInt64:

public static long ToInt64(DateTime value)
{
    return ((IConvertible)value).ToInt64(null);
}

底线? Microsoft 想在DateTime 中实现IConvertible 接口,但不希望提供除ToDateTimeToStringToType 之外的任何转换的实现。

【讨论】:

  • 我不同意“生成”部分(如果使用这样的模板,更改这样的模板并不难;尽管它可能属于“就是这样”的领域) ,但问题与 IConvertible 有关是有道理的。
  • @user2864740:我不再完全确定生成的代码,因为DateTime explicitly defines all conversions as a ClassCastException,甚至ToInt64 应该可以工作。
  • 我认为ToInt64 不起作用:它被记录为不起作用,并且使用 ILSpy 进行反编译同意。
  • 别忘了ToString(IFormatProvider) :)
  • @dlev:啊,鬼鬼祟祟的!它是唯一没有明确命名接口的实现。
猜你喜欢
  • 2020-06-09
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多