2009-08-20 4 views
2

У меня есть этот код:Длинный к объекту неявные преобразования сломан?

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)

ответ

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 получил тики .. Я не знал, что существует различие .. тьфу ...(идет и исправляет довольно много строк кода) – Earlz

+0

Нет, ToBinary включает свойство DateTime.Kind (два бита) и свойство DateTime.Ticks (шестьдесят два бита). – jason

+0

@earlz: Значение, возвращаемое 'ToBinary', также включает' DateTimeKind' в высоких бит. (Отсюда огромное отрицательное число, которое вы упомянули в вопросе.) – LukeH

0

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

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

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

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

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

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

Смежные вопросы