Почему GetType() возвращает тип DateTime для Nullable <DateTime>

Возможный дубликат:
Тип Nullable не является типом NULL?

В следующем коде:

DateTime? dt = DateTime.Now;
MessageBox.Show(dt.GetType().ToString());

в окне сообщения отображается "System.DateTime" вместо Nullable<DateTime>. Следующее также возвращает false (потому что GetType ошибочен):

if (dt.GetType().IsAssignableFrom(typeof(DateTime?))) 
 ...

(btw, используя DateTime? или Nullable<DateTime> не имеет значения) В окне просмотра у вас есть столбец "Тип", отображающий правильный тип (System.DateTime?).

В моем коде у меня есть ссылка на dt как object, поэтому мне нужно правильно подойти к базовому типу. Как я могу это сделать?

Ответ 1

Цитата MSDN (Как идентифицировать нулевой тип):

Вызов GetType по типу Nullable вызывает операцию бокса выполняется, когда тип неявно преобразован в объект. Поэтому GetType всегда возвращает объект Type, который представляет собой базовый тип, а не тип Nullable.

так что в основном ваш код равен:

    DateTime? dt = DateTime.Now;
    object box = (object)dt;
    Console.Write(box.GetType().ToString());

также, глядя на "Бокс Nullable Types" на MSDN, мы читаем:

Если объект не равен null - если HasValue верно - тогда бокс происходит, но только базовый тип что объект с нулевым значением основан на в коробке. Бокс не нулевой NULL value type box тип значения сама, а не System.Nullable(Of T) который обертывает тип значения.

это ясно объясняет "странное" поведение Nullable<T>.GetType()

Ответ 2

GetType() использует отражение для возврата типа. Чтобы узнать, является ли это типом с нулевым значением, вам нужно проверить значение PropertyType.

foreach (PropertyInfo pi in dt.GetType().GetProperties())
{
    if(pi.PropertyType == typeof(DateTime?))
    {
       // display nullable info
    }
}

Ответ 3

Потому что, если вы пишете что-то вроде этого:

DateTime? dt = null;
Type t = dt.GetType();

Это исключение NullReferenceException.