2011-06-28 4 views
5
var dict = new Dictionary<string, object>(); 
DateTime? myDate; 

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */ 

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value); 

No entiendo por qué tiene que haber una conversión implícita si uno u otro van a un diccionario esperando el tipo Objeto.¿Por qué no puedo usar un operador ternario con esta expresión?

+2

Este es un extremadamente pregunta frecuente en el SO. Ver http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959 para más detalles. Véase también mi artículo relacionado http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx –

+0

@Eric voy Echale un vistazo. ¡Gracias! – scottm

+1

De nada. El problema es que estás razonando en la dirección opuesta a la que explica el compilador. Usted está diciendo "Sé que esto va a algo que espera un objeto". Pero el compilador no sabe que * a priori * desea que se elija el método del "objeto". El compilador está tratando de razonar de otra manera. Se está preguntando "¿es el método que espera que el objeto sea compatible con esta expresión?" Para saber que debe preguntar "¿Cuál es el tipo de expresión?" ** El problema es que no puede funcionar el tipo de expresión para decidir si la expresión funciona. ** –

Respuesta

6

En C#, cada expresión condicional debe tener un tipo. ¿De qué tipo es tu expresión?

Entiendo su preocupación, la conversión no es necesaria para su caso particular, pero así es como funciona el compilador de C#, por lo que debe obedecer sus reglas.

Esto debería funcionar en lugar (no me registro sin embargo):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value); 
+0

mi expresión debe ser de tipo tipo System.DateTime o DBNull dependiendo de la condición de myDate.Value – scottm

+0

Fundición a el objeto funciona – scottm

+0

, entonces no es un tipo estático, sino un tipo dinámico. El compilador de C# está estático (aparte de algunas mecánicas 'dinámicas 'de las que no estoy completamente seguro). – Zruty

1

¿Usted intentó:

DateTime? date = myDate.HasValue ? myDate.Value : null; 

dict.Add("breakit", date); 
+1

Esto da el mismo error. – scottm

+0

A pesar de eso, no entiendo por qué tenemos que lanzar al objeto cuando se trata de la clase base maestra. –

Cuestiones relacionadas