Pregunta

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

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

Por lo que puedo ver, el operador coalescente nulo no es una opción debido a la conversión en línea que debe realizarse en la cadena .Text si no es nula.

Hasta donde yo sé, la única forma de hacer esto es usar una declaración if y/o asignarla en dos pasos.En este caso particular, lo encuentro 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 conoce una solución más elegante?

¿Fue útil?

Solución

El problema ocurre porque el operador condicional no observa 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, tienes un nulo y un Int32, y el tipo no se puede determinar (hay razones reales por las que no se puede simplemente asumir Anulable<Int32>).

Si realmente quieres usarlo de esta manera, debes convertir uno de los valores a Anulable<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),

Otros consejos

Creo que un método de utilidad podría ayudar a que esto sea 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);

Si bien Alex proporciona la respuesta correcta y aproximada 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 entradas no válidas, así como del escenario de cadenas vacías.De lo contrario, si el usuario ingresa algo como 1b se les presentará una página de error con la excepción no controlada causada en Convert.ToInt32(string).

Puedes transmitir la salida de Convert:

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 tener valor mayor que 0) en varibale X1.tuve que usar (int?) en Posid.Value para que el operador condicional no arroje ningún error de compilación.Solo para tu información GetHolidayCount es un WCF método que podría dar null o cualquier número.Espero que ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top