2010-03-15 15 views
8

duplicados posibles:
Nullable types and the ternary operator. Why won’t this work?
Conditional operator assignment with nullable<value> types?¿Por qué el operador condicional no permite correctamente el uso de "nulo" para la asignación a tipos anulables?

Esto no va a compilar, indicando "Tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'System.DateTime' y '' "

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? DateTime.Parse(TextBoxActualEndDate.Text) : null; 

T sus funciona bien

if (TextBoxActualEndDate.Text != "") 
    task.ActualEndDate = DateTime.Parse(TextBoxActualEndDate.Text); 
else 
    task.ActualEndDate = null; 
+2

¿Puede deshacerse de las dependencias de su código, para que podamos reproducir esto? Reemplace 'task.ActualEndDate' con una variable local, por ejemplo. –

+1

'int? q = verdad? 3: null; ' – SLaks

Respuesta

8

Esto no funciona porque el compilador no insertará una conversión implícita en ambos lados a la vez, y null requiere una conversión implícita para convertirse en un tipo anulable.

su lugar, puede escribir

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : new DateTime?(); 

Esto sólo requiere una conversión implícita (DateTime-DateTime?).

Alternativamente, puede convertir cualquier lado izquierdo:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)DateTime.Parse(TextBoxActualEndDate.Text) : null; 

Esto también requiere sólo una conversión implícita.

+0

Debería usar DateTime.TryParse (TextBoxActualEndDate.Text, out someDateVar) allí. Nunca confíes en la entrada para darte una cadena analizable. – Tomas

+2

Sí, pero no es mi código. – SLaks

+2

La validación se produce en un par de lugares antes de este análisis, y preferiría una excepción ahora en lugar de una cuando intente insertar DateTime.Min en la base de datos. –

4

El operador condicional no ve en qué se devuelve el valor. Solo mira los valores que se le piden que elija entre: un DateTime y un valor nulo. No puede identificarlos como instancias del mismo tipo (porque null no es un DateTime válido), de ahí el error. Usted y yo sabemos que Nullable<DateTime> podría hacer el trabajo, pero el operador condicional no puede introducir tipos "más grandes": solo se permite ver los tipos de las dos expresiones que elige. (Gracias a Aaronaught en los comentarios de aclaración de este punto y un buen ejemplo clarificador.)

Para evitar esto, dar al operador una pista echando el Tiempo:

TextBoxActualEndDate.Text != "" ? (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text)) : null; 
            ^^^^^^^^^^^ 
+2

En su mayoría correcto (+1): 'DateTime.Parse' devuelve un' DateTime' (no un 'Nullable '), que es un tipo de valor y no tiene conversión ay desde 'null'. El compilador no tiene la capacidad de introducir tipos "más grandes" en la ecuación cuando intenta resolver la expresión, solo puede funcionar con los tipos que están realmente allí. Es la misma razón por la que no puede escribir 'Stream s = expr? nuevo MemoryStream(): nuevo FileStream (...) '. – Aaronaught

+0

Aaronaught: gran explicación. Doblaré eso. – itowlson

0

La razón es que nula es tipo de object así que hay que echarlo al tipo correcto, así:

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    DateTime.Parse(TextBoxActualEndDate.Text) : ((DateTime?) null); 
0

la forma más correcta (OMI) es hacer esto

task.ActualEndDate = TextBoxActualEndDate.Text != "" ? 
    (DateTime?)(DateTime.Parse(TextBoxActualEndDate.Text) : null); 

Utilizo el operador nulo collaescing con frecuencia de esta manera.

0

Este es el error, probablemente, la que se obtiene en esta situación:

error CS0173: Tipo de condicional expresión no se puede determinar porque no hay implícita conversión entre '' y 'int')

El compilador está explicando que no sabe cómo convertir null en un DateTime.


Fix:

necesita castexplicitly la expression que puede volver a null el tipo nullable. Esto funcionará

((DateTime?) null); 
Cuestiones relacionadas