Долго ли возражать против неявных нарушителей?

2

У меня есть этот код:

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

При выполнении этого кода я получаю сообщение об ошибке d = new Date.. (последняя строка). В нем говорится, что аргумент вне диапазона; что он находится вне диапазона максимальных и минимальных тиков. Что кажется вероятным, поскольку использование отладчика l является огромным отрицательным числом (и я не думал, что тики могут быть отрицательными).

Является ли С# object/long сломанным или я просто что-то пропустил? Я также попытался установить DateTimeKind и ничего не сделал.

Кроме того, эта работа выполняется на 64-битной машине (хотя это не должно иметь значения из-за .NET)

Теги:
object
datetime
64bit

3 ответа

4
Лучший ответ

Попробуйте это вместо:

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

Обратите внимание, что я использую метод DateTime.FromBinary:

Отключает 64-битное двоичное значение и воссоздает исходный сериализованный объект DateTime.

Конструктор, который вы вызывали раньше, ожидал тиков в отличие от сериализованной формы DateTime.

3

Кто сказал, что ToBinary() получает Ticks?

Я предполагаю, что он должен выглядеть следующим образом:

DateTime d = DateTime.Today;
long l = d.Ticks;
object o = l;
d = new DateTime((long)o);
  • 0
    Я думал, что ToBinary получил галочки ... Я не знал, что есть различие ... тьфу ... (идет и исправляет довольно много строк кода)
  • 0
    Нет, ToBinary содержит свойство DateTime.Kind (два бита) и свойство DateTime.Ticks (шестьдесят два бита).
Показать ещё 1 комментарий
0

Вы должны использовать DateTime.FromBinary для восстановления DateTime из двоичного представления long, полученного с помощью DateTime.ToBinary.

Несколько других комментариев:

  • Преобразование из long в object, которое у вас есть в вашем коде, - это явное преобразование, а не неявное.

  • Странно, что ваше подозрение было бы в том, что такое преобразование нарушено. Без сомнения, это операция, которая была проверена битвой не менее миллиона раз с момента появления .NET.

  • Если вы используете отладчик (или операторы Console.WriteLine), вы могли бы видеть, что l и o представляют одно и то же значение long. Это предложило бы вам, что это не преобразование, которое нарушено, но что-то еще.

  • MSDN может быть чрезвычайно полезна для ответа на такие вопросы, как этот. Как только вы поняли, что l был очень отрицательным, ваше подозрение должно было состоять в том, что DateTime.ToBinary не представляет только DateTime.Ticks. документация подтверждает это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню