2012-10-12 127 views
15

tengo una clase como estaAsignación de valor null` `para contener nulos <DateTime> con una sola línea 'si'

public class MyClass 
{ 
    public int Id { get; set; } 
    public Nullable<DateTime> ApplicationDate { get; set; } 
    .... 
} 

Ahora estoy tratando de llenar un objeto de MyClass como esto

DataTable dt = DBHelper.GetDataTable(sql, conn); 
DataRow dr = dt.Rows[0]; 

MyClass oMyClass = new MyClass(); 
oMyClass.Id = (int)dr["Id"]; 
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? null : Convert.ToDateTime(dr["AppDate"]); 
//Above line gives an error 
.... 

asignación de valor Fecha de solicitud da un error

Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'

¿Qué me falta aquí?

Respuesta

46

, es necesario especificar null a DateTime?:

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value 
    ? (DateTime?)null 
    : Convert.ToDateTime(dr["AppDate"]); 

Esto es debido a la forma en que el compilador determina el tipo resultante de la conditional operator; el comportamiento es por diseño:

O bien el tipo de first_expression y second_expression debe ser el mismo, o una conversión implícita debe existir de un tipo a otro.

Desde null por sí mismo is of null type y por lo tanto no hay conversión desde o hacia él, que necesita para ayudar al compilador mediante fundición.

+0

no null' 'tiene que ser moldeado así? Parece que el mensaje de error se refiere a 'null' y' System.DateTime'. – Default

+1

@Default: Sí 'nulo' es lo que debe ser lanzado, mi mal. – Jon

+0

Obtengo que el objeto 'Nullable debe tener un valor' al hacer algo similar a esto y estas respuestas en esta página, incluido el molde' (DateTime?) Null'. – vapcguy

6
oMyClass.ApplicationDate = 
    dr["ApplDate"] == DBNull.Value ? 
    (DateTime?)null : 
    Convert.ToDateTime(dr["AppDate"]); 

Todo el compilador sabe es que una cosa se evalúa como un null y los demás como resultado un DateTime. El compilador se queja porque no se puede convertir de uno a otro, por lo que depende de ti el enviarlos a algo que pueda ser ambos valores.

Tenga en cuenta que DateTime? es la abreviatura de Nullable<DateTime>.
También tenga en cuenta que solo necesita convertir el valor nulo ya que hay una conversión implícita entre DateTime? y DateTime, por lo que el compilador puede hacer esa conversión por sí mismo.

3

probar esto:

oMyClass.ApplicationDate = 
    dr["ApplDate"] == DBNull.Value ? (DateTime?)null : 
            Convert.ToDateTime(dr["AppDate"]); 

También puede aplicar el reparto de la última expresión.

1

Usted tendrá que convertir "nulo" en anulable

Prueba este código:

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]); 
0
DateTime? dt = (DateTime?)null; 

o

Nullable<DateTime> dt = (Nullable<DateTime>)null; 
0

Usted puede utilizar default que asignará el valor predeterminado de un Tipo no inicializado.

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? default(Nullable<DateTime>) : Convert.ToDateTime(dr["AppDate"]); 

Más ejemplos

bool isHappy = default(bool); //isHappy = false 
int number = default(int); //number = zero 
string text = default(text); // text = null 
MyObject myObject = default(MyObject); // myObject = null 
DateTime? date = default(DateTime?); //date = null 
Cuestiones relacionadas