【问题标题】:Why does System.Convert() provide implementation of not supported conversions?为什么 System.Convert() 提供不支持的转换的实现?
【发布时间】:2022-06-28 22:48:45
【问题描述】:

MS 文档:

ToDateTime(对象)
将指定对象的值转换为 DateTime 对象。

ToDateTime(双)
调用此方法总是抛出 InvalidCastException。

ToDateTime(Int32)
调用此方法总是抛出 InvalidCastException。

ToDateTime(Int16)
调用此方法总是抛出 InvalidCastException。

ToDateTime(Int64)
调用此方法总是抛出 InvalidCastException。

ToDateTime(十进制) 调用此方法总是抛出 InvalidCastException。

为什么要提供这样的方法?

MS 源代码(包括 cmets):

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
    // ----------------------------------------------------------------------

每个“x”代表支持的转换。但是对于空白“”(不支持的版本)也有方法,例如

        public static DateTime ToDateTime(byte value) {
            return ((IConvertible)value).ToDateTime(null);
        }

另见类似问题: Why does System.Convert has ToDateTime that accepts DateTime?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为是因为源中的这条评论:“转换集是对称的,因此对于每个 ToXXX(YYY) 也有一个 ToYYY(XXX)。”
    • 我不明白他们为什么需要添加(例如)静态方法 Convert.ToDateTime(Int32)Convert.ToInt32(DateTime)。如果被调用,这两种方法都会抛出 - 但它们都可以从 Convert 的原始设计中省略而不会丢失功能。这实际上只是一个泄漏的实现细节吗?
    猜你喜欢
    • 2011-02-12
    • 2016-06-12
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2018-10-07
    • 2011-10-01
    相关资源
    最近更新 更多