У меня есть этот код:
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)
Попробуйте это вместо:
DateTime d = DateTime.Today;
long l = d.ToBinary();
object o = (long)l;
d = DateTime.FromBinary((long)o);
Обратите внимание, что я использую метод DateTime.FromBinary
:
Отключает 64-битное двоичное значение и воссоздает исходный сериализованный объект DateTime.
Конструктор, который вы вызывали раньше, ожидал тиков в отличие от сериализованной формы DateTime
.
Кто сказал, что ToBinary() получает Ticks?
Я предполагаю, что он должен выглядеть следующим образом:
DateTime d = DateTime.Today;
long l = d.Ticks;
object o = l;
d = new DateTime((long)o);
Вы должны использовать DateTime.FromBinary
для восстановления DateTime
из двоичного представления long
, полученного с помощью DateTime.ToBinary
.
Несколько других комментариев:
Преобразование из long
в object
, которое у вас есть в вашем коде, - это явное преобразование, а не неявное.
Странно, что ваше подозрение было бы в том, что такое преобразование нарушено. Без сомнения, это операция, которая была проверена битвой не менее миллиона раз с момента появления .NET.
Если вы используете отладчик (или операторы Console.WriteLine
), вы могли бы видеть, что l
и o
представляют одно и то же значение long
. Это предложило бы вам, что это не преобразование, которое нарушено, но что-то еще.
MSDN может быть чрезвычайно полезна для ответа на такие вопросы, как этот. Как только вы поняли, что l
был очень отрицательным, ваше подозрение должно было состоять в том, что DateTime.ToBinary
не представляет только DateTime.Ticks
. документация подтверждает это.