2011-01-21 13 views
14

Duplicar posibles:
Nullable type is not a nullable type?¿Por qué es GetType() volver tipo DateTime para anulable <DateTime>

En el siguiente código:

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

el cuadro de mensaje muestra "Sistema .DateTime ", en lugar de Nullable<DateTime>. Lo siguiente también devuelve falso (debido a que el GetType está mal):

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

(por cierto, el uso de DateTime? o Nullable<DateTime> no hace una diferencia) En la ventana de inspección, usted tiene la columna "Type" que está mostrando el tipo correcto (System.DateTime?).

En mi código tengo una referencia a dt como object, así que necesito llegar al tipo subyacente correctamente. ¿Cómo puedo hacer esto?

+0

duplicado de http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable-type que parece tener una buena respuesta – Chris

+0

Ver http://msdn.microsoft.com/es-es/library/ms366789 (v = VS.100) .aspx algo de información, pero no es un duplicado de solución –

+0

http://stackoverflow.com/questions/374651/how-to-check-if-an -object-are-nullable que tiene una solución. – PoppaVein

Respuesta

11

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

Calling GetType en un tipo anulable provoca que una operación de boxeo para ser realiza cuando el tipo es implícitamente convertidos en objetos. Por lo tanto, GetType siempre devuelve un tipo de objeto que representa el tipo subyacente, no el tipo Nullable.

así que básicamente su código es igual a:

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

también, mirando a "Boxing Nullable Types" en MSDN leemos:

Si el objeto no es nulo - si es HasValue true - entonces boxeo ocurre, pero solo el tipo subyacente que el objeto que acepta nulos se basa en está encuadrado. El cuadro de tipos de valor que no admite nulos se puede incluir en el cuadro , no el valor System.Nullable (Of T) que ajusta el tipo de valor.

esta claro que explican el comportamiento "extraño" de Nullable<T>.GetType()

0

Porque si se escribe así:

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

Fue un NullReferenceException.

+0

devolvió 1 ... sólo porque él es un usuario nuevo aquí. – Cipi

3

GetType() usa la reflexión para devolver un tipo. Para saber si es un tipo que admite nulos, debe verificar el valor PropertyType.

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