Pregunta

Parece que hay algún tipo de confusión en el operador ternario. Sé que esto ha sido abordado en otros hilos que sí, pero siempre ha sido con nullables. Además, para mi caso estoy realmente sólo en busca de una mejor manera.

Me gustaría ser capaz de utilizar

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;

pero en cambio estoy atascado con esto:

if (string.IsNullOrEmpty(dest.Id))
{
    proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
    proc.Parameters[PARAM_ID].Value = dest.Id;
} 

El operador ternario falla porque no hay conversión posible entre DBNull y la cadena, y tan tonto como parece que es objeto considerando Valor, el compilador patadas de nuevo a mí y me veo obligado a la atención. La respuesta a la versión anulable de esta pregunta es que acaba de lanzar nulo en una cadena y acabar de una vez; DBNull no se puede convertir a la cadena, aunque, por lo que no hay suerte.

¿Hay una manera más concisa para hacer esto (sin utilizar nullables, por cierto?)

Gracias!

¿Fue útil?

Solución

Se podría cambiar su primera declaración a:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;

Otros consejos

El Value propiedad es de tipo object, por lo que debe emitir a object, no string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;

O se podría añadir un método de extensión, tales como:

public static class DBNullExtensions
{
    public static object AsDBNullIfEmpty(this string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            return DBNull.Value;
        }
        return value;
    }
}

Y entonces se podría decir simplemente

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();

(Adaptado de Phil Haack )

legible y conciso, no?

¿Qué pasa con el ?? operador nulo coalescencia Más detalles sobre ?? operador

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top