Долго ли возражать против неявных нарушителей? - PullRequest
2 голосов
/ 21 августа 2009

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

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

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

C # 1008 * сломан или я что-то здесь упускаю? Я также попытался установить DateTimeKind, и это ничего не сделало.

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

Ответы [ 3 ]

4 голосов
/ 21 августа 2009

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

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

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

Десериализует 64-разрядное двоичное значение и воссоздает оригинальный сериализованный объект DateTime.

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

3 голосов
/ 21 августа 2009

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

Полагаю, это должно выглядеть так:

DateTime d = DateTime.Today;
long l = d.Ticks;
object o = l;
d = new DateTime((long)o);
0 голосов
/ 21 августа 2009

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

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

  1. Преобразование из long в object, имеющееся в вашем коде, является явным, а не неявным.

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

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

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

...