uso usar unario ternario operadores operador como asignacion c# conditional-operator nullable

usar - operadores de asignacion en c#



AsignaciĆ³n de operador condicional con tipos<value> de Nullable? (5)

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : Convert.ToInt32(employeeNumberTextBox.Text),

A menudo me encuentro queriendo hacer cosas como esta ( EmployeeNumber es un Nullable<int> ya que es una propiedad en un objeto dbml LINQ-to-SQL donde la columna permite valores NULL). Desafortunadamente, el compilador considera que "No hay conversión implícita entre ''null'' e ''int''", aunque ambos tipos serían válidos en una operación de asignación a una int nullable por sí mismos.

El operador coalescente nulo no es una opción por lo que puedo ver debido a la conversión en línea que debe ocurrir en la cadena .Text si no es nulo.

Hasta donde yo sé, la única forma de hacerlo es usar una declaración if y asignarla en dos pasos. En este caso particular, me parece muy frustrante porque quería usar la sintaxis del inicializador de objetos y esta asignación estaría en el bloque de inicialización ...

Alguien sabe una solución más elegante?


Creo que un método de utilidad podría ayudar a hacer esto más limpio.

public static class Convert { public static T? To<T>(string value, Converter<string, T> converter) where T: struct { return string.IsNullOrEmpty(value) ? null : (T?)converter(value); } }

entonces

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);


El problema ocurre porque el operador condicional no mira cómo se usa el valor (asignado en este caso) para determinar el tipo de expresión, solo los valores verdadero / falso. En este caso, tiene un nulo y un Int32 , y no se puede determinar el tipo (hay razones reales por las que no puede asumir Nullable <Int32> ).

Si realmente desea usarlo de esta manera, debe convertir uno de los valores a Nullable <Int32> usted mismo, para que C # pueda resolver el tipo:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? (int?)null : Convert.ToInt32(employeeNumberTextBox.Text),

o

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text),


Mientras que Alex proporciona la respuesta correcta y proximal a su pregunta, prefiero usar TryParse :

int value; int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value) ? (int?)value : null;

Es más seguro y se ocupa de los casos de entrada no válida, así como de su escenario de cadena vacía. De lo contrario, si el usuario ingresa algo como 1b se le presentará una página de error con la excepción no controlada causada en Convert.ToInt32(string) .


Puede emitir el resultado de Convertir:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) ? null : (int?)Convert.ToInt32(employeeNumberTextBox.Text)


//Some operation to populate Posid.I am not interested in zero or null int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response; var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null;

EDITAR: Breve explicación de lo anterior, estaba tratando de obtener el valor de Posid (si no es nulo int y tiene un valor mayor que 0) en el varibale X1 . Tuve que usar (int?) En Posid.Value para que el operador condicional no arrojara ningún error de compilación. Solo un FYI GetHolidayCount es un método WCF que podría dar null o cualquier número. Espero que ayude