微软文档:
ToDateTime(Object)
将指定对象的值转换为 DateTime 对象。
ToDateTime(Double)
调用此方法始终抛出 InvalidCastException。
ToDateTime(Int32)
调用此方法始终抛出 InvalidCastException。
ToDateTime(Int16)
调用此方法始终抛出 InvalidCastException。
ToDateTime(Int64)
调用此方法始终抛出 InvalidCastException。
ToDateTime(Decimal) 调用此方法始终抛出 InvalidCastException。
为什么要提供这样的方法呢?
MS源代码(包括注释):
https://referencesource.microsoft.com/#mscorlib/system/convert.cs
开头是一个矩阵,描述支持哪些转换,哪些不支持:
// From: To: Bol Chr SBy Byt I16 U16 I32 U32 I64 U64 Sgl Dbl Dec Dat Str
// ----------------------------------------------------------------------
// Boolean x x x x x x x x x x x x x
// Char x x x x x x x x x x
// SByte x x x x x x x x x x x x x x
// Byte x x x x x x x x x x x x x x
// Int16 x x x x x x x x x x x x x x
// UInt16 x x x x x x x x x x x x x x
// Int32 x x x x x x x x x x x x x x
// UInt32 x x x x x x x x x x x x x x
// Int64 x x x x x x x x x x x x x x
// UInt64 x x x x x x x x x x x x x x
// Single x x x x x x x x x x x x x
// Double x x x x x x x x x x x x x
// Decimal x x x x x x x x x x x x x
// DateTime x x
// String x x x x x x x x x x x x x x x
// ----------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
每个“x”代表支持的转换。但对于空白“”(不支持的版本)也有方法,例如
public static DateTime ToDateTime(byte value) {
return ((IConvertible)value).ToDateTime(null);
}
Run Code Online (Sandbox Code Playgroud)
另请参阅类似的问题: Why does System.Convert has ToDateTime that Accepts DateTime?
因为给定用户定义(值)类型 \xe2\x80\x93 的任何其他选项 \xe2\x80\x93 都更复杂。当没有泛型时(就像定义这些类型时的情况一样),情况更是如此。
\n将 .NET 7/C# 11 与(通用)接口的静态成员进行比较,例如IParsable<TSelf>在运行时可能仍会抛出(或失败),因为在使用采用Object.
或者,您可以强制所有可能的数据类型仅在编译时定义,这很好,直到您需要将数据传递给其他不完美的程序和用户或从其他程序和用户传递数据。
\n