Pergunta

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

Muitas vezes eu me encontro querendo fazer coisas como esta (EmployeeNumber é um Nullable<int> como é uma propriedade em um LINQ para SQL, dbml objeto de onde a coluna permite valores NULOS).Infelizmente, o compilador considera que "não Há nenhuma conversão implícita entre 'null' e 'int'", apesar de ambos os tipos, válidas em uma operação de atribuição a um anulável int por conta própria.

Null coalescência operador não é uma opção tão longe quanto eu possa ver, porque inline conversão que precisa acontecer no .Seqüência de caracteres de texto se ele não é nulo.

Até onde eu sei, a única maneira de fazer isso é usar uma instrução if e/ou atribuí-lo em duas etapas.Neste caso particular, eu acho isso muito frustrante, porque eu queria usar o inicializador de objeto sintaxe e essa atribuição seria na inicialização do bloco de...

Alguém sabe uma solução mais elegante?

Foi útil?

Solução

O problema ocorre porque o operador condicional não olhar para a forma como o valor é usado (atribuído, neste caso) para determinar o tipo da expressão -- apenas os valores true/false.Neste caso, você tem uma null e um Int32, e o tipo não pode ser determinado (há razões reais que ele não pode simplesmente assumir Anulável<Int32>).

Se você realmente quiser usá-lo desta forma, você deve lançar um dos valores para Anulável<Int32> a si mesmo, assim C# pode resolver o tipo:

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

ou

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

Outras dicas

Eu acho que um utilitário de método poderia ajudar a fazer essa limpeza.

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);
    }
}

em seguida,

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

Enquanto Alex fornece o correto e proximal resposta para a sua pergunta, eu prefiro usar o TryParse:

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

É mais seguro e cuida de casos de uma entrada inválida, bem como a sua seqüência de caracteres vazia cenário.Caso contrário, se o usuário insere algo como 1b eles serão apresentados com uma página de erro com a excepção não processada causados em Convert.ToInt32(string).

Você pode converter a saída de Converter:

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 explicação acima, eu estava a tentar obter o valor de Posid (se o seu não-null int e ter valor maior que 0) em varibale X1.Eu tive que usar (int?) no Posid.Value para obter o operador condicional não lançar qualquer erro de compilação.Apenas um FYI GetHolidayCount é um WCF método que poderia dar null ou qualquer número.Espero que ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top