Operador condicional atribuição com Nullable<value> tipos?
-
09-06-2019 - |
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?
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