Assegnazione operatore condizionale con tipi Nullable?

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

Spesso mi trovo a voler fare cose del genere ( EmployeeNumber è un Nullable poiché è una proprietà su un object dbml LINQ-to-SQL in cui la colonna consente i valori NULL). Sfortunatamente, il compilatore ritiene che “Non vi è alcuna conversione implicita tra” null “e” int “”, anche se entrambi i tipi sarebbero validi in un’operazione di assegnazione a un valore nullable int per conto proprio.

L’operatore coalescente Null non è un’opzione, per quanto posso vedere, a causa della conversione inline che deve verificarsi sulla stringa .Text se non è nulla.

Per quanto ne so, l’unico modo per farlo è usare un’istruzione if e / o assegnarla in due passaggi. In questo caso particolare lo trovo molto frustrante perché volevo utilizzare la syntax di inizializzazione dell’object e questo compito sarebbe stato nel blocco di inizializzazione …

Qualcuno conosce una soluzione più elegante?

Il problema si verifica perché l’operatore condizionale non osserva come viene utilizzato il valore (assegnato in questo caso) per determinare il tipo di espressione – solo i valori vero / falso. In questo caso, hai un nullo e un Int32 e il tipo non può essere determinato (ci sono dei veri motivi per cui non si può semplicemente assumere Nullable ).

Se vuoi davvero usarlo in questo modo, devi lanciare uno dei valori su Nullable , quindi C # può risolvere il tipo:

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

o

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

Penso che un metodo di utilità potrebbe contribuire a rendere questo più pulito.

 public static class Convert { public static T? To(string value, Converter converter) where T: struct { return string.IsNullOrEmpty(value) ? null : (T?)converter(value); } } 

poi

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

Mentre Alex fornisce la risposta corretta e prossimale alla tua domanda, preferisco usare TryParse :

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

È più sicuro e si occupa dei casi di input non validi e dello scenario di stringa vuoto. In caso contrario, se l’utente immette qualcosa come 1b , verrà visualizzata una pagina di errore con l’eccezione non gestita causata da Convert.ToInt32(string) .

Puoi trasmettere l’output di Converti:

 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; 

EDIT: Breve spiegazione di sopra, stavo cercando di ottenere il valore di Posid (se non int nullo e con valore maggiore di 0) in varibale X1 . Ho dovuto usare (int?) Su Posid.Value per ottenere che l’operatore condizionale non Posid.Value alcun errore di compilazione. Solo un FYI GetHolidayCount è un metodo WCF che può dare un numero null o qualsiasi. Spero possa aiutare