当操作“不支持”时,为什么会有Convert.ToInt32(DateTime)方法?

本文关键字:不支持 ToInt32 Convert DateTime 方法 操作 为什么 | 更新日期: 2023-09-27 18:18:50

在文档中,Convert.ToInt32(DateTime)方法总是抛出一个InvalidCastException,因为"不支持此转换"。

如果它不被支持,为什么它还存在?没有这个函数不是更有意义吗?

当操作“不支持”时,为什么会有Convert.ToInt32(DateTime)方法?

查看Convert实现,您可以看到它依赖于由正在转换的类型实现的IConvertible接口。IConvertible接口强制一个类型实现所有转换方法,它的目的是像您所描述的那样工作:

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

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

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

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

我之前对代码生成的预感是错误的。实际上比这简单得多:DateTime中几乎所有IConvertible接口的实现都会抛出一个InvalidCastException。当你调用Convert.ToXXX()时,这些调用总是被调用,正如你在这里看到的:

Convert.ToInt64:

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

底线吗?微软希望在DateTime中实现IConvertible接口,但不希望提供除ToDateTime, ToStringToType之外的任何转换的实现。