2011-01-21 15 views
14

Eventuali duplicati:
Nullable type is not a nullable type?Perché GetType() restituendo tipo DateTime per Nullable <DateTime>

Nel codice seguente:

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

il messaggio di dialogo mostra "Sistema .DateTime ", anziché Nullable<DateTime>. Di seguito restituisce anche falsa (perché il GetType è sbagliato):

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

(btw, utilizzando DateTime? o Nullable<DateTime> non fa una differenza) Nella finestra di controllo, si ha la colonna "Type" che è la visualizzazione del tipo corretto (System.DateTime?).

Nel mio codice ho riferimento a dt come object, quindi ho bisogno di arrivare al tipo sottostante correttamente. Come posso fare questo?

+0

duplicato di http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable-type che sembra avere una buona risposta – Chris

+0

Vedere http://msdn.microsoft.it/it/us/library/ms366789 (v = VS.100) .aspx per alcune informazioni, ma non una soluzione –

+0

duplicata di http://stackoverflow.com/questions/374651/how-to-check-if-an -object-is-nullable che ha una soluzione. – PoppaVein

risposta

11

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

Calling GetType su un tipo Nullable impedisce l'operazione di boxe per essere eseguita quando il tipo è implicitamente convertito in oggetto. Pertanto GetType restituisce sempre un oggetto Type che rappresenta il tipo sottostante, non il tipo Nullable.

Quindi, in pratica il codice è uguale a:

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

anche, guardando "Boxing Nullable Types" su MSDN leggiamo:

Se l'oggetto non è nullo - se HasValue è true - quindi si verifica il boxing , ma solo il tipo sottostante che l'oggetto nullable è basato su è in scatola. Il boxing di un valore non nulla null inserisce il valore di tipo stesso, non il System.Nullable (Of T) che include il tipo di valore.

questo spiega chiaramente il comportamento "strano" di Nullable<T>.GetType()

0

Perché se si scrive qualcosa di simile:

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

E 'stata una NullReferenceException.

+0

Restituito +1 ... solo perché è un nuovo utente qui. – Cipi

3

GetType() utilizza la riflessione per restituire un tipo. Per scoprire se si tratta di un tipo annullabile è necessario verificare il valore PropertyType.

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