为什么 System.Convert() 提供不支持的转换的实现?

hfr*_*ile 6 .net c#

微软文档:

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?

Ric*_*ard 3

因为给定用户定义(值)类型 \xe2\x80\x93 的任何其他选项 \xe2\x80\x93 都更复杂。当没有泛型时(就像定义这些类型时的情况一样),情况更是如此。

\n

将 .NET 7/C# 11 与(通用)接口的静态成员进行比较,例如IParsable<TSelf>在运行时可能仍会抛出(或失败),因为在使用采用Object.

\n

或者,您可以强制所有可能的数据类型仅在编译时定义,这很好,直到您需要将数据传递给其他不完美的程序和用户或从其他程序和用户传递数据。

\n

  • 拥有所有方法意味着“IConvertible”的实现者可以将大多数情况(即使预计会失败)委托给“Converter”(DRY)的静态方法。当这些方法被定义时(20 多年前),.NET 是非常不同的……当时的推理在今天并不能证明它们的包含是合理的(恕我直言)。 (3认同)