2010-10-29 11 views
12

Se siente extraño para mí que sea fundición nula a un tipo así que quería volver a comprobar que esta es la forma correcta de hacer esto:¿Es correcto convertir nulo en nulable cuando se usa la expresión ternaria asignando un tipo que admite nulos?

decimal? d = data.isSpecified ? data.Value : (decimal?)null; 

alt text

alt text

NOTA: I estoy marcando la respuesta que sugiere el método que personalmente me gusta más:

decimal? d = data.isSpecified ? data.Value : default(decimal?) 
+1

No necesita el modelo. 'decimal?' aceptará un nulo, directamente. –

+0

capturas de pantalla adicionales para su referencia. –

+6

@Robert Harvey, tiene razón en que 'decimal?' Aceptará nulo, pero el compilador necesita poder determinar el tipo de retorno de la expresión ternaria, que solo puede hacer si arroja nulo a 'decimal?'. –

Respuesta

17

Sí, está bien. Alternativas:

condition ? (decimal?) value : null 

condition ? new decimal?(value) : null 

condition ? value : default(decimal?) 

condition ? value : new decimal?() 

Elija lo que le resulte más legible.

No hay nada que puedas hacer fuera de la expresión en sí, ya que es el tipo de expresión que el compilador desconoce. Por ejemplo, poner toda la expresión entre corchetes y moldearlo no ayudaría.

+0

¿Funcionaría sin el molde si 'valor' ya era' decimal? '? –

+0

@Robert: Sí, en ese caso estaría bien. El problema es que el tipo de expresión condicional * cualquiera * tiene que ser el tipo de LHS * o * el tipo de RHS ... y "nulo" no tiene un tipo. –

2

Ye s, está perfectamente bien.

1

¿Es data.Value de tipo decimal? Si es así, aquí hay una notación alternativa, sin el molde:

decimal? d = data.isSpecified ? new decimal?(data.Value) : null; 
Cuestiones relacionadas