Usar el operator ternario de C# con nullables
Todos los días se aprende algo…
Desde hace mucho tenemos disponible el operador ternario (o condicional) en C#, también conocido como el operador “?“.
El operador ternario sirve para regresar/usar uno de dos posibles valores, dependiendo de una condición boleana.
La estructura es:
condicion-boleana ? valor-si-se-cumple : valor-si-no-se-cumple
Es decir, permite reducir de esto:
int? myVar; //variable int nullable if(string.IsNullOrEmpty(textbox1.Text)) { myVar = null; } else { myVar = Convert.ToInt32(textbox1.Text); }
a esto:
myVar =string.IsNullOrEmpty(textbox1.Text) ? null : Convert.ToInt32(textbox1.Text);
Y uno esperaría que el código del segundo bloque compile, pero no es así. En lugar de que funcione, el compilador nos marca el siguiente error:
Type of conditional expression cannot be determined because there is no implicit conversion between ‘<null>’ and ‘int’
Yo llevaba años usando el operador ternario y siempre me pareció ilógico que no se permitiera esto. Y probablemente fue más ilógico el hecho de nunca haber googleado como solucionar esto..ya que la solución es simple.
myVar =string.IsNullOrEmpty(textbox1.Text) ? (int?)null : Convert.ToInt32(textbox1.Text);
o
myVar =string.IsNullOrEmpty(textbox1.Text) ? null : (int?)Convert.ToInt32(textbox1.Text);
Simple…el compilador tenía razon. No hay una conversión implícita entre null e int, pero sí entre null y Nullable<int> (a.k.a. int?). Casteando cualquiera de los lados de la expresión, va a compilar sin problemas.
Espero les sirva.