2012-02-16 7 views
14

no puedo entender por qué esto no funcionará¿Por qué no puedo asignar nulo a decimal con operador ternario?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+2

No somos lectores de la mente, ¿qué no funciona? –

+2

Se llama el operador condicional, no el operador ternario –

+0

@JakubKonecki aunque está claro. Siempre es bueno proporcionar la mayor cantidad de información posible. En este caso, un error de compilación –

Respuesta

34

Debido null es de tipo object (efectivamente sin tipo) y hay que asignarlo a un objeto escrito.

esto debería funcionar:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : (decimal?)null; 

o esto es un poco mejor:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : default(decimal?); 

Aquí está el enlace de MSDN para la palabra clave default.

+0

Muchas gracias slugster. –

+1

fanbloodytastic! – northpole

+3

La mejor respuesta es la que no solo responde sino que informa y educa .. nice one slugster –

2

Es necesario que tire la primera parte para decimal?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+1

Eso no haría la diferencia. Un 'decimal' se puede poner en un' decimal? '. –

+0

"El tipo de salida del operador ternario es el tipo de la primera parte": esto no es cierto ... puede ser del tipo de la primera o la segunda parte, dependiendo de las conversiones que existan entre ellos –

+1

Puede asignar un 'decimal' a' decimal? 'sin conversión explícita. – slugster

3
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
          decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) : 
          (decimal?)null; 
5

Prueba esto:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
         decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) : 
         (decimal?) null; 

El El problema es que el compilador no sabe qué tipo tiene null. Lo que sólo puede echarlo a decimal?

3

Porque el compilador no puede inferir el mejor tipo de los operandos del operador condicional.

Cuando se escribe condition ? a : b, tiene que haber una conversión implícita del tipo de a al tipo de b, o con el tipo de b al tipo de a. El compilador inferirá el tipo de la expresión completa como el tipo de destino de esta conversión. El compilador nunca considera el hecho de que lo asigne a una variable de tipo decimal?. En su caso, los tipos de a y b son decimal y algunos tipos de referencia desconocidos o nulos. El compilador no puede adivinar a qué se refiere, por lo que necesita para ayudar a que:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
          ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
          : default(decimal?); 
6

No utilice decimal.Parse.

Convert.ToDecimal devolverá 0 si se le da una cadena nula. decimal.Parse arrojará una ArgumentNullException si la cadena que desea analizar es nula.

Cuestiones relacionadas