【问题标题】:Long to Object implicit converions broken?Long to Object 隐式转换坏了?
【发布时间】:2009-08-20 20:27:20
【问题描述】:

我有这个代码:

DateTime d = DateTime.Today;
long l = d.ToBinary();
object o = (long)l;
d = new DateTime((long)o);

执行此代码时,d = new Date..(最后一行)出现错误。它说参数超出范围;它超出了最大和最小刻度的范围。这似乎很可能,因为使用调试器l 是一个巨大的负数(我不认为滴答声可能是负数)。

是 C# 的 object/long 坏了还是我只是在这里遗漏了什么?我也试过设置DateTimeKind,但什么也没做。

此外,这项工作是在 64 位机器上完成的。(尽管由于 .NET 这应该无关紧要)

【问题讨论】:

    标签: c# datetime object 64-bit


    【解决方案1】:

    试试这个:

    DateTime d = DateTime.Today;
    long l = d.ToBinary();
    object o = (long)l;
    d = DateTime.FromBinary((long)o);
    

    注意我使用的是DateTime.FromBinary 方法:

    反序列化 64 位二进制值并重新创建原始序列化的 DateTime 对象。

    您之前调用的构造函数预期的是滴答声,而不是DateTime 的序列化形式。

    【讨论】:

      【解决方案2】:

      谁说 ToBinary() 会得到 Ticks?

      我认为它应该是这样的:

      DateTime d = DateTime.Today;
      long l = d.Ticks;
      object o = l;
      d = new DateTime((long)o);
      

      【讨论】:

      • 我认为 ToBinary 有滴答声.. 我不知道有区别.. 呃...(修复了好几行代码)
      • 否,ToBinary 包括 DateTime.Kind 属性(两位)和 DateTime.Ticks 属性(六十二位)。
      • @earlz:ToBinary 返回的值还包含高位中的DateTimeKind。 (因此您在问题中提到了巨大的负数。)
      【解决方案3】:

      您应该使用DateTime.FromBinary 从使用DateTime.ToBinary 获得的long 二进制表示重构DateTime

      其他几个cmets:

      1. 代码中从longobject 的转换是显式转换,而不是隐式转换。

      2. 奇怪的是,您怀疑这样的转换被破坏了。毫无疑问,这是自 .NET 出现以来经过至少一百万次战场测试的操作。

      3. 如果您使用调试器(或Console.WriteLine 语句),您可能会看到lo 代表相同的long 值。这会向您表明,被破坏的不是转换,而是其他原因。

      4. MSDN 对于回答此类问题非常有帮助。一旦你意识到l 是非常消极的,你就应该怀疑DateTime.ToBinary 不仅仅代表DateTime.Ticksdocumentation 证实了这一点。

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多