2012-06-28 2 views
3
DateTime? testDate = (DateTime?)arrayOfObjects[dateObject]; 

Этот код выглядит нормально? Я попытался использовать оператор as, но получил ошибку «с ошибкой». Я пытаюсь сказать, что объект, который я выбираю из массива, либо DateTime, либо null DateTime, но и может быть назначен testDate.Кастинг объекта, который может быть пустым

Не кажется, что это так, я думаю, что мне не хватает чего-то очевидного.

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

DateTime? testDate = arrayOfObjects[dateObject] as DateTime?; 

является либо строка коды лучшим способом обработки потенциальными аннулирует?

+0

Добавьте код где arrayOfObjects получает населенный ... – weismat

+0

Это результат запроса SQL. Это ResultTableCollection. –

+0

Если вы можете использовать отладчик, вы можете увидеть тип, используемый при разрыве после того, как результат запроса будет заполнен, или вы добавите туда вызов типа. Какой драйвер DB вы используете> – weismat

ответ

0

Лучше был бы сделать что-то вроде:

if(arrayOfObjects[dateObject] != null && arrayOfObjects[dateObject] is DateTime) 
{ 
    DateTime testDate = (DateTime)arrayOfObjects[dateObject]; 
    // logic here 
} 

или что-то вроде:

DateTime? testDate = null; 
if(arrayOfObjects[dateObject] is DateTime) 
{ 
    testDate = (DateTime)arrayOfObjects[dateObject]; 
} 
else if (arrayOfObjects[dateObject] is Nullable<DateTime>) 
{ 
    testDate = (Nullable<DateTime>)arrayOfObjects[dateObject]; 
} 
+0

'DateTime?' Также является типом значения. – Joey

+0

Большое спасибо. Ну, на самом деле проблема не связана с отказом от копирования, и я не вижу необходимости обязательно проверять значение null, поскольку testDate примет значение null. +1. –

+0

Хех, мне нужно снова прочитать книгу Скита. :) – Candide

4

является либо строкой коды лучшим способом обработки потенциальными аннулирует?

Вторая форма беззвучно приводит к null, когда массив содержит что-то иное, кроме DateTime. Это кажется хорошей причиной для использования первого.

К основному вопросу:

я что-то отсутствует, или это типичный (или, по крайней мере приемлемый) подход

Это приемлемо, но немного неясным, может быть, потому что это «скрывать» операцию распаковки.
Вы могли бы использовать:

DateTime? testDate = null; 
if (arrayOfObjects[dateObject] != null) 
    testDate = (DateTime) arrayOfObjects[dateObject]; // no '?' 

Но это многословным. И эта конкретная проблема не поддается условному оператору (?:)

Так что я бы придерживался вашей первой версии.

+0

А я, хорошая точка, большое спасибо. –

-1

Попробуйте использовать Array.ConvertAll метод. Ниже приводится примерно то, как оно реализовано:

DateTime?[] dates = Array.ConvertAll<object, DateTime?>arrayOfObjects,DateTime); 

Примечание: Это всего лишь приблизительная идея. вы можете исправить его в соответствии с вашими ожиданиями.

+0

Это не сработает, поскольку исходные объекты не являются DateTime? –

+0

ответ модифицировано. –

2

DateTime? более короткая форма для другой структуры

Nullable<DateTime> { 
    bool HasValue; 
    DateTime Value; 
} 

Вы никогда не получите этот тип из вашей БД, так что первая строка никогда не будет отбрасывать правильно. База данных предоставит вам значение DateTime, хранящееся в переменной объекта. Или нулевое (нетипизированное).

DateTime - это структура, поэтому оператор «как» не будет работать на нее.Так, просто проверить нуль следующим образом:

DateTime? testDate = arrayOfObjects[dateObject] == null ? (DateTime?) null : (DateTime)arrayOfObjects[dateObject]; 
Смежные вопросы