2011-01-21 13 views
14

Powiel możliwe:
Nullable type is not a nullable type?Dlaczego GetType() powrocie typu DateTime dla Nullable <DateTime>

W poniższym kodzie:

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

się komunikat „System .DateTime ", zamiast Nullable<DateTime>. Dodaje również zwraca false (ponieważ GetType jest źle):

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

(btw, używając DateTime? lub Nullable<DateTime> nie robi różnicy) W oknie zegarka, masz kolumnie „Typ”, który jest wyświetlanie poprawny typ (System.DateTime?).

W moim kodzie mam odniesienie do dt jako object, więc muszę dostać się do właściwego typu poprawnie. Jak mogę to zrobić?

+0

duplikatu http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable-type która wydaje się mieć dobra odpowiedź – Chris

+0

Zobacz http://msdn.microsoft.com/en-us/library/ms366789 (v = VS.100) .aspx dla niektórych informacji, ale nie dla rozwiązania –

+0

duplikat http://stackoverflow.com/questions/374651/how-to-check-if-an -object-is-nullable, który ma rozwiązanie. – PoppaVein

Odpowiedz

11

Cytowanie MSDN (How to: Identify a Nullable Type):

Wywołanie GetType na pustych typu powoduje działanie bokserski być wykonywane, gdy typ jest niejawnie przekształcić w obiekt. Dlatego też GetType zawsze zwraca obiekt Type, który reprezentuje typ bazowy, a nie typ Nullable.

więc w zasadzie kod jest równa:

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

też, patrząc na "Boxing Nullable Types" na MSDN czytamy:

Jeśli obiekt nie jest null - jeżeli HasValue jest true - wówczas boxing występuje, ale tylko ukryty typ , który jest obiektem o wartości zerowej, jest oparty na . Boxing z wartością zerową o wartości zerowej null przyjmuje wartości typu , a nie System.Nullable (Of T) , który otacza typ wartości.

to jasno wytłumaczyć „dziwne” zachowanie Nullable<T>.GetType()

0

Bo jeśli napisać coś takiego:

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

Było NullReferenceException.

+0

Oddał +1 ... tylko dlatego, że jest tu nowym użytkownikiem. – Cipi

3

GetType() używa odbicia, aby zwrócić typ. Aby dowiedzieć się, czy jest to typ zerowy, należy sprawdzić wartość PropertyType.

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