Pergunta

Parece que há algum tipo de confusão no operador ternário. Eu sei que isso foi abordado em outros threads SO, mas sempre foi com nulos. Além disso, para o meu caso, estou realmente apenas procurando uma maneira melhor.

Eu gostaria de poder usar

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

Mas, em vez disso, estou preso a isso:

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

O operador ternário falha porque não há conversão possível entre dbnull e string e, por mais bobo que isso pareça considerar o valor ser objeto, o compilador o chuta de volta para mim e sou forçado a me importar. A resposta para a versão anulável desta pergunta é apenas lançar nulo para cordas e ser feito com ela; O DBNULL não pode ser escalado para cordas, então não há sorte lá.

Existe uma maneira mais concisa de fazer isso (sem usar nulos, a propósito?)

Obrigado!

Foi útil?

Solução

Você pode alterar sua primeira declaração para:

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

Outras dicas

o Value A propriedade é do tipo object, então você deve ser lançado para object, não string:

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

Ou você pode adicionar um método de extensão como:

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

E então você pode apenas dizer

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

(Adaptado de Phil Haack)

Legável e conciso, não?

Que tal usar o ?? operador de coalescação nula Mais detalhes sobre ?? operador

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top