4

查看元数据我发现了这个函数:(在“System.Convert”类中)

    //
    // Summary:
    //     Calling this method always throws System.InvalidCastException.
    //
    // Parameters:
    //   value:
    //     The date and time value to convert.
    //
    // Returns:
    //     This conversion is not supported. No value is returned.
    //
    // Exceptions:
    //   System.InvalidCastException:
    //     This conversion is not supported.
    public static bool ToBoolean(DateTime value);

为什么微软这样做?

4

5 回答 5

6

Convert 类对于处理装箱的值类型非常方便。一条硬 C# 规则说您必须始终将其拆箱为完全相同的类型:

    object box = 42;
    long value = (long)box;  // Kaboom!

这会生成一个 InvalidCastException。非常不方便,尤其是因为将 int 转换为 long 从来都不是问题。然而,在泛型可用之前,必须使拆箱高效,这在 .NET 1.x 中非常重要。

每个值类型都实现了 IConvertable 接口。这使此代码可以解决问题:

    object box = 42;
    long value = Convert.ToInt64(box);  // No problem

虽然这看起来很合成,但真正的用例是从 dbase 读取数据。您将获得作为装箱值的列值。很明显,很可能有一个 oops 列是日期值并且程序尝试将其读取为布尔值。Convert.ToBoolean(DateTime) 方法可确保在发生这种情况时您会听到一声巨响。

于 2013-10-16T19:24:46.617 回答
5

根据 MSDN,Convert.ToBoolean(DateTime)保留以供将来使用

他们很可能已经在其中添加了它,以防止在实施后出现向后兼容性问题。但是,将 DateTime 转换为布尔值意味着什么,完全超出了我的理解。

于 2013-10-16T19:04:28.630 回答
2

这是静态Convert类的一部分。毫无疑问,与提供的其他方法对称:有一种Convert.ToDateTime将事物转换为 DateTimes,还有一种Convert.ToSTring很乐意将 DateTimes 转换为字符串。不是将每个转换方法定义为只接受它理解的参数,而是每个方法都有一组通用的重载,其中一些只是存根。

于 2013-10-16T19:02:47.400 回答
1

因为微软的某个人决定System.Convert需要一种方法来转换到每个原始类型/从每个原始类型转换,无论转换是否可能。

请注意,有几种方法是这样的:

Convert.ToDateTime(Boolean value)
Convert.ToBoolean(Char value)

和大部分ToChar方法。

于 2013-10-16T19:19:01.793 回答
0

所以这会引发错误链接

    DateTime actualdate;
    bool canNotConvert = Convert.ToBoolean(actualdate);
于 2013-10-16T19:11:02.640 回答